Rust:什么是 tokio::select 匹配

Rust: what is tokio::select macthing

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

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

        let ws_msg = ws_stream.next();
           {
           match ws_msg {
              Some(msg) => match msg {
    ...

无法编译,因为无法匹配 ws_msg:

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! 宏保留在一个分支上,那就没问题了。即这段代码编译运行:

         tokio::select! {
             ws_msg = ws_stream.next() => {
                 match ws_msg {
                     Some(msg) => match msg {

我的问题是:select! 中的赋值 ws_msg = ws_stream.next()let 中的赋值是否有所不同? (我的意思是,显然情况似乎如此,但从 select! 文档中我无法推断出有什么区别。 任何帮助深表感谢!!提前致谢。

你应该匹配 ws_stream.next().await

我预计 tokio::select!() 会在幕后为您进行等待以及两种期货之间的实际选择。然后运行最先完成的future对应的代码,给它await得到的值,就是原代码匹配的awaited值。如果你只有一个流,那么你不需要 select!(),但你现在需要明确的 .await.