以下是一个关于 IT 技术的示例,你可以在这里查看它的实际应用:
let msg = stream.next().await.context("expected a message")??;
这里是否只是将?
操作做了两次?如果是,为什么在这种情况下需要这样做呢?
以下是一个关于 IT 技术的示例,你可以在这里查看它的实际应用:
let msg = stream.next().await.context("expected a message")??;
这里是否只是将?
操作做了两次?如果是,为什么在这种情况下需要这样做呢?
是的,只是将 ?
重复使用了两次;没有 ??
运算符。
stream
是一个 WsStream
。 WsStream
是同一模块中定义的类型。 WsStream
实现了 Stream
接口。
stream.next()
调用了StreamExt::next
,它返回一个产生 Option<Self::Item>
的 future。 对于 WsStream
,Self::Item
被定义为 tungstenite::Result<Message>
(= Result<Message, tungstenite::Error>
)。 这意味着 stream.next().await
的结果是类型为 Option<Result<Message, tungstenite::Error>>
。
然后,在该值上应用了 context
。 Context
适用于 Option<T>
和 Result<T, E>
,但输出始终为 Result
。 但是,context
不会展开任何内容,因此我们最终得到的是 Result<Result<Message, tungstenite::Error>, anyhow::Error>
。 因此,两个 ?
的用法都用于处理两个级别的 Result
。
是的,这只是两次使用?
运算符。以下是一个快速示例:
fn result_of_result() -> Result<Result<i32, String>, String> {
Ok(Ok(42))
}
fn f() -> Result<(), String> {
println!("{:?}", result_of_result());
println!("{:?}", result_of_result()?);
println!("{:?}", result_of_result()??);
Ok(())
}
fn main() {f();}
输出:
Ok(Ok(42))
Ok(42)
42
这大致上相当于一个用于unwrap()
或try!
的操作符, 因此可以扩展成以下内容:
let msg = try!(stream.next().await.context("expected a message")).unwrap();
使用异步代码时,你会经常看到await?
,但await??
似乎有些奇怪。