Обертывание AsyncRead - PullRequest
       65

Обертывание AsyncRead

1 голос
/ 27 мая 2020

Кажется, я не могу заставить компилятор позволить мне обернуть Tokio AsyncRead:

use std::io::Result;
use core::pin::Pin;
use core::task::{Context, Poll};

use tokio::io::AsyncRead;

struct Wrapper<T: AsyncRead>{
    inner: T
}

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

Кажется, он должен компилироваться, но компилятор жалуется, что я не включил правильную привязку трейта даже хотя poll_read доступен через AsyncRead: Ссылка на игровую площадку

error[E0599]: no method named `poll_read` found for type parameter `T` in the current scope
  --> src/lib.rs:17:20
   |
17 |         self.inner.poll_read(cx, buf)
   |                    ^^^^^^^^^ method not found in `T`
   |
   = help: items from traits can only be used if the type parameter is bounded by the trait

Что я делаю не так?

1 Ответ

0 голосов
/ 27 мая 2020

Посмотрите на self в подписи для poll_read:

fn poll_read(
    self: Pin<&mut Self>, // Self is pinned!
    cx: &mut Context,
    buf: &mut [u8]
) -> Poll<Result<usize>>

Self закреплен, что означает, что poll_read может вызываться только на Pin<&mut T>! self.inner имеет тип T, поэтому компилятор не может найти на нем poll_read. Чтобы исправить это, нам нужно каким-то образом закрепить доступ к полю.

Там есть весь раздел документации Rust Pin по этому поводу и весь ящик выделенный для решения этой проблемы.

...