rust - 无法在tokio::fs::File上调用poll_read

标签 rust rust-tokio tokio

我有一个封装了File结构的结构,并且我希望这个结构实现AsyncRead特性,以便可以在代码的其他部分中代替File来使用它:

struct TwoWayFile<'a> {
    reader: &'a File,
}

impl<'a> AsyncRead for TwoWayFile<'a> {
    fn poll_read(
        mut self: Pin<&mut Self>,
        cx: &mut Context<'_>,
        buf: &mut [u8],
    ) -> Poll<io::Result<usize>> {
        self.reader.poll_read(cx, buf)
    }
}

根据文档,tokio::fs::File已经实现了tokio::io::AsyncRead,但是编译器说的恰恰相反:
error[E0599]: no method named `poll_read` found for reference `&'a tokio::fs::file::File` in the current scope
  --> src/main.rs:44:21
   |
44 |         self.reader.poll_read(cx, buf)
   |                     ^^^^^^^^^ method not found in `&'a tokio::fs::file::File`

这里缺少什么?为什么我不能调用已经为File定义的方法?

最佳答案

您的问题很可能是poll_read方法是在Pin<&mut Self>上实现的,而不是在&self上实现的。这意味着您只能在固定的可变引用上调用它,而不能在普通引用上调用它。

您可以使用Box::pin将引用固定在堆上,或者使用pin_mut!宏将引用固定在“异步堆栈”上,然后应该可以调用该方法。

关于rust - 无法在tokio::fs::File上调用poll_read,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60920804/

相关文章:

rust - 如何在Rust中将借来的值保存到struct字段中

rust - Rust程序打印的值与预期值不同

rust - 如何在 Rust 中的字段之间对齐没有填充的打包结构?

reference - Rust:引用如何成为类型?

sockets - 如何将Tokio设置为多线程UDP服务器?

timer - 如何使用 Tokio 产生许多可取消的计时器?

asynchronous - 如何借用/避免在 tokio::spawn(async

rust - 尝试使用Rust tokio Framed LinesCodec写入服务器

rust - 如何实现具有具体生命周期的 FromStr?