两个可变指针
Two mutable pointers
在学习async_std
的过程中,我在Rust中遇到了以下习语
let (reader, writer) = &mut (&stream, &stream);
这使得 reader
和 writer
都成为指向 stream
的可变指针。它是如何工作的?
Rust 不会阻止您拥有两个或更多可变指针吗?
Which makes both reader
and writer
mutable pointers to stream
.
没有。这是对元组的可变引用,其中包含对 stream
的 不可变 引用。不可能使用它来改变原始 stream
,您所能做的就是通过交换对完全不同的流的引用来改变元组。
您可以对它们使用 Read
和 Write
的方法,因为 &TcpStream
实现了 Read
和 Write
。在那个表达式中,reader
和writer
的类型是&mut &TcpStream
,不是&mut TcpStream
.
请注意,Read
和 Write
并未针对实现它们的所有类型的引用而实现。例如 Write
是为 Cursor<Vec<u8>>
实现的,但它是 而不是 是为 &Cursor<Vec<u8>>
实现的。这种实现是不可靠的,因为它允许通过两个不同的可变引用访问相同的内存位。
trait 方法大多采用 &mut self
所以 如果 有多个 reader 是不安全的或同一个 reader 或 writer 上的 writers,它可以很好地实现,Rust 类型系统将负责确保只有一个。但这对 TcpStream
来说限制太多,因为可以有多个 reader 和作者。
而不是通过添加另一个更宽松的特征来复制代码 async_std
实现 Read
和 Write
以在合理的情况下实现不可变引用。您看到的模式是一种使此设计有效的“技巧”。
在学习async_std
的过程中,我在Rust中遇到了以下习语
let (reader, writer) = &mut (&stream, &stream);
这使得 reader
和 writer
都成为指向 stream
的可变指针。它是如何工作的?
Rust 不会阻止您拥有两个或更多可变指针吗?
Which makes both
reader
andwriter
mutable pointers tostream
.
没有。这是对元组的可变引用,其中包含对 stream
的 不可变 引用。不可能使用它来改变原始 stream
,您所能做的就是通过交换对完全不同的流的引用来改变元组。
您可以对它们使用 Read
和 Write
的方法,因为 &TcpStream
实现了 Read
和 Write
。在那个表达式中,reader
和writer
的类型是&mut &TcpStream
,不是&mut TcpStream
.
请注意,Read
和 Write
并未针对实现它们的所有类型的引用而实现。例如 Write
是为 Cursor<Vec<u8>>
实现的,但它是 而不是 是为 &Cursor<Vec<u8>>
实现的。这种实现是不可靠的,因为它允许通过两个不同的可变引用访问相同的内存位。
trait 方法大多采用 &mut self
所以 如果 有多个 reader 是不安全的或同一个 reader 或 writer 上的 writers,它可以很好地实现,Rust 类型系统将负责确保只有一个。但这对 TcpStream
来说限制太多,因为可以有多个 reader 和作者。
而不是通过添加另一个更宽松的特征来复制代码 async_std
实现 Read
和 Write
以在合理的情况下实现不可变引用。您看到的模式是一种使此设计有效的“技巧”。