границы признаков rust tokio не были выполнены при прямом методе

#rust #rust-tokio

Вопрос:

Я обновил wrap , и tokio в моем проекте rust, и после обновления метод переадресации получил ошибку. Я просмотрел документацию, но в новой версии tokio framework не было прямого метода.

Ошибка

 error[E0599]: the method `forward` exists for struct `tokio::sync::mpsc::UnboundedReceiver<_>`, but its trait bounds were not satisfied


tokio::task::spawn(client_rcv.forward(client_ws_sender).map(|result| {
                                      ^^^^^^^ method cannot be called on `tokio::sync::mpsc::UnboundedReceiver<_>` due to unsatisfied trait bounds
40 | pub struct UnboundedReceiver<T> {
   | -------------------------------
   | |
   | doesn't satisfy `_: warp::Stream`
   | doesn't satisfy `tokio::sync::mpsc::UnboundedReceiver<_>: StreamExt`
   |
   = note: the following trait bounds were not satisfied:
           `tokio::sync::mpsc::UnboundedReceiver<_>: warp::Stream`
           which is required by `tokio::sync::mpsc::UnboundedReceiver<_>: StreamExt`
           `amp;tokio::sync::mpsc::UnboundedReceiver<_>: warp::Stream`
           which is required by `amp;tokio::sync::mpsc::UnboundedReceiver<_>: StreamExt`
           `amp;mut tokio::sync::mpsc::UnboundedReceiver<_>: warp::Stream`
           which is required by `amp;mut tokio::sync::mpsc::UnboundedReceiver<_>: StreamExt`
 

Код:

 let (client_ws_sender, mut client_ws_rcv) = ws.split();
let (client_sender, client_rcv) = mpsc::unbounded_channel();

tokio::task::spawn(client_rcv.forward(client_ws_sender).map(|result| {
    if let Err(e) = result {
        eprintln!("error sending websocket msg: {}", e);
    }
}));
 

Грузовые зависимости:

 [dependencies]
tokio = { version = "1.6.0", features = ["full"] }
warp = "0.3.1"
serde = {version = "1.0", features = ["derive"] }
serde_json = "1.0"
futures = { version = "0.3", default-features = false }
uuid = { version = "0.8.2", features = ["serde", "v4"] }
 

Ответ №1:

Наиболее показательными строками этого сообщения об ошибке являются следующие:

    | doesn't satisfy `_: warp::Stream`
   | doesn't satisfy `tokio::sync::mpsc::UnboundedReceiver<_>: StreamExt`
 

forward Метод определен в StreamExt черте; из-за общей реализации все, что реализует Stream , также реализует StreamExt . Однако, начиная с версии Tokio v1.6.0, UnboundedReceiver больше не реализуется Stream . Вместо этого в документации говорится:

Этот приемник можно превратить в Stream использование UnboundedReceiverStream .

Следовательно:

 let (client_ws_sender, mut client_ws_rcv) = ws.split();
let (client_sender, client_rcv) = mpsc::unbounded_channel();
let client_rcv = UnboundedReceiverStream::new(client_rcv);  // <-- this

tokio::task::spawn(client_rcv.forward(client_ws_sender).map(|result| {
    if let Err(e) = result {
        eprintln!("error sending websocket msg: {}", e);
    }
}));