两个可变指针

Two mutable pointers

在学习async_std的过程中,我在Rust中遇到了以下习语

let (reader, writer) = &mut (&stream, &stream);

这使得 readerwriter 都成为指向 stream 的可变指针。它是如何工作的? Rust 不会阻止您拥有两个或更多可变指针吗?

Which makes both reader and writer mutable pointers to stream.

没有。这是对元组的可变引用,其中包含对 stream 不可变 引用。不可能使用它来改变原始 stream,您所能做的就是通过交换对完全不同的流的引用来改变元组。

您可以对它们使用 ReadWrite 的方法,因为 &TcpStream 实现了 ReadWrite。在那个表达式中,readerwriter的类型是&mut &TcpStream不是&mut TcpStream.

请注意,ReadWrite 并未针对实现它们的所有类型的引用而实现。例如 Write 是为 Cursor<Vec<u8>> 实现的,但它是 而不是 是为 &Cursor<Vec<u8>> 实现的。这种实现是不可靠的,因为它允许通过两个不同的可变引用访问相同的内存位。

trait 方法大多采用 &mut self 所以 如果 有多个 reader 是不安全的或同一个 reader 或 writer 上的 writers,它可以很好地实现,Rust 类型系统将负责确保只有一个。但这对 TcpStream 来说限制太多,因为可以有多个 reader 和作者。

而不是通过添加另一个更宽松的特征来复制代码 async_std 实现 ReadWrite 以在合理的情况下实现不可变引用。您看到的模式是一种使此设计有效的“技巧”。