首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rust:什么是tokio::select macthing

Rust:什么是tokio::select macthing
EN

Stack Overflow用户
提问于 2021-11-11 14:35:30
回答 1查看 81关注 0票数 0

晚上好。我正在尝试用Rust构建一个websockets客户端。我的主要编码经验来自python,所以我尝试遵循下面这段代码:https://github.com/bedroombuilds/python2rust/tree/main/23

我只想收听一个频道并打印到屏幕上;所以在我的实现中没有使用代码片段中tokio::select!的逻辑。但如果我这样做:

代码语言:javascript
复制
        let ws_msg = ws_stream.next();
           {
           match ws_msg {
              Some(msg) => match msg {
    ...

它不会编译,因为它不能匹配ws_msg

代码语言:javascript
复制
error[E0308]: mismatched types
   --> src/main.rs:145:22
    |
144 |                  match ws_msg {
    |                        ------ this expression has type `Next<'_, WebSocketStream<tokio_tungstenite::stream::Stream<tokio::net::TcpStream, tokio_tls::TlsStream<tokio::net::TcpStream>>>>`
145 |                      Some(msg) => match msg {
    |                      ^^^^^^^^^ expected struct `Next`, found enum `Option`
    |
    = note: expected struct `Next<'_, WebSocketStream<tokio_tungstenite::stream::Stream<tokio::net::TcpStream, tokio_tls::TlsStream<tokio::net::TcpStream>>>>`
                 found enum `Option<_>`

尽管如此,如果我只保留tokio::select!宏的一个分支,那么它是可以的。也就是说,此代码编译并运行:

代码语言:javascript
复制
         tokio::select! {
             ws_msg = ws_stream.next() => {
                 match ws_msg {
                     Some(msg) => match msg {

我的问题是:select!中的赋值ws_msg = ws_stream.next()let中的赋值是否有所不同?(我的意思是,显然是这样的,但从select!文档中我无法推断出有什么不同。任何帮助都是非常感谢的!!提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-11 17:28:21

你应该在ws_stream.next().await上匹配。

我希望tokio::select!()在幕后为你做等待,以及在两个未来之间进行实际选择。然后,它运行与最先完成的未来相对应的代码,为其提供由await获得的值,并且该值是原始代码匹配的期待值。如果只有一个流,那么就不需要select!(),但是现在需要显式的.await

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69930099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档