gpt4 book ai didi

rust - 为什么从 TcpStream 更改为特征会导致 "cannot borrow immutable borrowed content as mutable"?

转载 作者:行者123 更新时间:2023-11-29 08:27:02 26 4
gpt4 key购买 nike

我想创建一个使用异步 IO 的 SOCKS5 代理的变体。我以前在 Haskell 中做过这个,所以我认为这将是一个很好的学习挑战。我从非常 well-documented SOCKS5 example code 开始.

在示例中,Transfer struct 要求读取器和写入器的类型为 TcpStream .在我的代码中,这些需要是多态的,所以我首先定义:

pub trait Pollable {
fn poll_read(&self) -> Async<()>;
fn poll_write(&self) -> Async<()>;
}

impl Pollable for TcpStream {
fn poll_read(&self) -> Async<()> {
tokio_core::net::TcpStream::poll_read(&self)
}
fn poll_write(&self) -> Async<()> {
tokio_core::net::TcpStream::poll_write(&self)
}
}

pub trait AsyncStream: tokio_io::AsyncRead + tokio_io::AsyncWrite + Pollable {}

impl<T> AsyncStream for T
where
T: tokio_io::AsyncRead + tokio_io::AsyncWrite + Pollable,
{}

当我切换 reader 的类型时在第 510 行来自 Rc<TcpStream>Rc<AsyncStream> ,编译器失败并在第 598 行出现此错误:

error[E0596]: cannot borrow immutable borrowed content as mutable
--> src/transfer.rs:125:33
|
125 | let n = try_nb!((&*self.reader).read(&mut buffer));
| ^^^^^^^^^^^^^^^ cannot borrow as mutable

忽略错误信息中的文件和行号;我正在将代码移动到多个文件中,但它在其他方面与示例相同。

根据我在 Stack Overflow 上其他地方找到的建议,我检查了类型。更改前,&*self.reader 的类型是&tokio_core::net::TcpStream ;更改后类型变为&transfer::AsyncStream + 'static .我不知道为什么 'static当我从具体类型变为特征时,生命周期就到来了......

为什么会这样?我该如何解决?

最佳答案

tokio_core::net::TcpStream 工具 Read AsyncRead for an immutable reference .你的特质没有。

&*self.reader转换 Rc<T>&T ,用作 read 的目标方法。

要修复它,您需要为对特征的不可变引用实现适当的特征,或者使用某种内部可变性。

另见:

关于rust - 为什么从 TcpStream 更改为特征会导致 "cannot borrow immutable borrowed content as mutable"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48463540/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com