在Rust中,"??"是什么意思?

3

以下是一个关于 IT 技术的示例,你可以在这里查看它的实际应用:

let msg = stream.next().await.context("expected a message")??;

这里是否只是将?操作做了两次?如果是,为什么在这种情况下需要这样做呢?

3个回答

6

是的,只是将 ? 重复使用了两次;没有 ?? 运算符。

stream 是一个 WsStreamWsStream 是同一模块中定义的类型。 WsStream 实现了 Stream 接口。

stream.next() 调用了StreamExt::next,它返回一个产生 Option<Self::Item> 的 future。 对于 WsStreamSelf::Item 被定义为 tungstenite::Result<Message> (= Result<Message, tungstenite::Error>)。 这意味着 stream.next().await 的结果是类型为 Option<Result<Message, tungstenite::Error>>

然后,在该值上应用了 contextContext 适用于 Option<T>Result<T, E>,但输出始终为 Result。 但是,context 不会展开任何内容,因此我们最终得到的是 Result<Result<Message, tungstenite::Error>, anyhow::Error>。 因此,两个 ? 的用法都用于处理两个级别的 Result


2

是的,这只是两次使用运算符。以下是一个快速示例:

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

0

这大致上相当于一个用于unwrap()try!的操作符, 因此可以扩展成以下内容:

let msg = try!(stream.next().await.context("expected a message")).unwrap();

使用异步代码时,你会经常看到await?,但await??似乎有些奇怪。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接