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
相关产品推荐
相关产品推荐

