在学习async_std时,我在“锈病”中遇到了以下成语
let (reader, writer) = &mut (&stream, &stream);这使得reader和writer都成为指向stream的可变指针。它怎麽工作?铁锈不会阻止你有两个或更多的可变指针吗?
发布于 2021-07-29 22:44:30
,它使
reader和writer都具有指向stream的可变指针。
这是对元组的可变引用,包含对stream的不可变引用。不可能使用它来变异原始的stream,您所能做的就是通过交换对一个完全不同的流的引用来改变元组。
您可以在这些方面使用Read和Write的方法,因为&TcpStream实现了Read和Write。在这个表达式中,reader和writer的类型是&mut &TcpStream,不是 &mut TcpStream。
注意,Read和Write并不是对实现它们的所有类型的引用实现的。例如,Write是为Cursor<Vec<u8>>实现的,但它是而不是为&Cursor<Vec<u8>>实现的。此实现将不健全,因为它将允许通过两个不同的可变引用访问相同的内存。
特征方法大多采用&mut self,因此如果在同一个阅读器或作者上有多个读取器或作者是不安全的,则可以很好地实现它,而锈蚀类型系统将负责确保只有一个读取器或作者。但是这对TcpStream来说太严格了,因为可以有多个读者和作者。
async_std不是通过添加另一个更宽松的特性来复制代码,而是在合适的情况下为不可变的引用实现Read和Write。你所看到的模式是一种“诡计”,使这一设计工作。
https://stackoverflow.com/questions/68583468
复制相似问题