【发布时间】:2018-07-05 22:07:42
【问题描述】:
我想使用异步 IO 创建一个 SOCKS5 代理的变体。我以前在 Haskell 中做过这个,所以我认为这将是一个很好的学习挑战。我从 well-documented SOCKS5 example code 开始。
在示例中,Transfer 结构要求读取器和写入器的类型为 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,
{}
当我在第 510 行将 reader 的类型从 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 生命周期...
为什么会这样?我该如何解决?
【问题讨论】:
-
猜测:也许
TcpStream有一个名为read的方法采用&self,但AsyncStream(或其超特征之一)有一个名为read的方法采用@987654338 @?
标签: rust