1

我有一个封装结构的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

4

1 回答 1

2

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

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

于 2020-03-30T00:58:53.153 回答