无法在 tokio::fs::File 上呼叫 poll_read

Can't call poll_read on tokio::fs::File

我有一个封装了 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! 宏固定在 "async stack" 上,然后应该能够调用该方法。