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
.
晚上好。我正在尝试用 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
.