首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两个可变指针

两个可变指针
EN

Stack Overflow用户
提问于 2021-07-29 22:28:47
回答 1查看 148关注 0票数 2

在学习async_std时,我在“锈病”中遇到了以下成语

代码语言:javascript
复制
let (reader, writer) = &mut (&stream, &stream);

这使得readerwriter都成为指向stream的可变指针。它怎麽工作?铁锈不会阻止你有两个或更多的可变指针吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-29 22:44:30

,它使readerwriter都具有指向stream的可变指针。

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

您可以在这些方面使用ReadWrite的方法,因为&TcpStream实现了ReadWrite。在这个表达式中,readerwriter的类型是&mut &TcpStream不是 &mut TcpStream

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

特征方法大多采用&mut self,因此如果在同一个阅读器或作者上有多个读取器或作者是不安全的,则可以很好地实现它,而锈蚀类型系统将负责确保只有一个读取器或作者。但是这对TcpStream来说太严格了,因为可以有多个读者和作者。

async_std不是通过添加另一个更宽松的特性来复制代码,而是在合适的情况下为不可变的引用实现ReadWrite。你所看到的模式是一种“诡计”,使这一设计工作。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68583468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档