【问题标题】:rust tokio trait bounds were not satisfied on forward methodrust tokio trait bounds 不满足 forward 方法
【发布时间】:2021-08-08 15:20:26
【问题描述】:

我在我的 rust 项目中升级了wraptokio,升级后转发方法出错。我翻遍了文档,但是新版tokio框架中没有forward方法。

错误

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`
           `&tokio::sync::mpsc::UnboundedReceiver<_>: warp::Stream`
           which is required by `&tokio::sync::mpsc::UnboundedReceiver<_>: StreamExt`
           `&mut tokio::sync::mpsc::UnboundedReceiver<_>: warp::Stream`
           which is required by `&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"] }

【问题讨论】:

    标签: rust rust-tokio


    【解决方案1】:

    该错误消息中最能说明问题的行如下:

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

    forward 方法在 StreamExt 特征中定义;由于a blanket implementation,任何实现Stream 的东西也实现StreamExt。但是,从 Tokio v1.6.0 开始,UnboundedReceiver 不再实现 Stream。文档改为:

    这个接收者可以使用UnboundedReceiverStream变成Stream

    因此:

    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);
        }
    }));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-23
      • 2022-11-16
      • 2017-05-17
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 2017-12-13
      • 1970-01-01
      相关资源
      最近更新 更多