Невозможно вызвать poll_read для tokio :: fs :: File - PullRequest
0 голосов
/ 30 марта 2020

У меня есть структура, которая инкапсулирует структуру 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?

1 Ответ

1 голос
/ 30 марта 2020

Возможно, проблема в том, что метод poll_read реализован на Pin<&mut Self>, а не на &self. Это означает, что вы можете вызывать его только для закрепленной изменяемой ссылки, а не для простой ссылки.

Вы можете закрепить свою ссылку в куче, используя Box::pin, или в "асинхронном c стеке", используя pin_mut! макрос, и затем должен иметь возможность вызывать метод.

...