Rust 什么是??你喜欢生锈吗?

Rust 什么是??你喜欢生锈吗?,rust,operator-keyword,Rust,Operator Keyword,以下是一个例子: 只是?做了两次?如果是这样的话,为什么在这种情况下需要这样做呢?它大约是一个,因此可以扩展为: let msg = try!(stream.next().await.context("expected a message")).unwrap(); 对于异步代码,您经常会看到等待?,但是等待???看起来确实很奇怪。是的,只是?被执行了两次;没有??操作员 stream是一个WsStreamWsStream是在同一模块中定义的类型WsStream实现流 str

以下是一个例子:

只是
做了两次?如果是这样的话,为什么在这种情况下需要这样做呢?

它大约是一个,因此可以扩展为:

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

对于异步代码,您经常会看到
等待?
,但是
等待???
看起来确实很奇怪。

是的,只是
被执行了两次;没有
??
操作员

stream
是一个
WsStream
WsStream
是在同一模块中定义的类型<代码>WsStream
实现

stream.next()
调用,它返回一个产生
选项的未来<代码>自我::项
被定义为
WsStream
tungstenite::结果
=Result
)。这意味着
stream.next().await
的结果类型为
Option


然后,在值上应用<代码>上下文
是为
选项
结果
实现的,但输出始终是
结果
。然而,
context
并不能使任何东西变得平坦,所以我们最终得到的结果是
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();}
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