You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust WebSocket开发中tokio::select!赋值与let赋值差异疑问

核心原因说明

两者的本质差异在于是否执行了next()返回的Future并获取执行结果:

  • 普通let语句是直接赋值表达式的返回值:ws_stream.next()的返回值是Next类型的Future结构体,并未被执行,因此赋值给ws_msg的就是这个结构体本身,当然无法匹配Option的Some分支。这个逻辑和Python中调用async函数不加await只会拿到协程对象、拿不到执行结果的规则完全一致。
  • tokio::select!的分支逻辑会自动执行右侧的Future:宏内部会持续poll右侧的Future直到其执行完成,再将Future的输出结果(也就是你需要的Option<Result<WebSocketMessage, Error>>类型)绑定到左侧的ws_msg变量上,此时变量类型和match的分支自然是匹配的。
无需select!的正确写法

你只需要监听单路消息的场景完全不需要引入select!,只要手动对next()返回的Future添加.await触发执行即可,示例代码如下:

// 循环监听消息直到连接断开
while let Some(msg_res) = ws_stream.next().await {
    match msg_res {
        Ok(msg) => println!("收到消息:{:?}", msg),
        Err(err) => eprintln!("消息接收错误:{}", err),
    }
}

内容的提问来源于stack exchange,提问作者Cristián Antuña

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 20:24:02