晚上好。我正在尝试用Rust构建一个websockets客户端。我的主要编码经验来自python,所以我尝试遵循下面这段代码:https://github.com/bedroombuilds/python2rust/tree/main/23
我只想收听一个频道并打印到屏幕上;所以在我的实现中没有使用代码片段中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!文档中我无法推断出有什么不同。任何帮助都是非常感谢的!!提前谢谢。
发布于 2021-11-11 17:28:21
你应该在ws_stream.next().await上匹配。
我希望tokio::select!()在幕后为你做等待,以及在两个未来之间进行实际选择。然后,它运行与最先完成的未来相对应的代码,为其提供由await获得的值,并且该值是原始代码匹配的期待值。如果只有一个流,那么就不需要select!(),但是现在需要显式的.await。
https://stackoverflow.com/questions/69930099
复制相似问题