gpt4 book ai didi

rust - 这个问号运算符是关于什么的?

转载 作者:行者123 更新时间:2023-11-29 07:40:05 29 4
gpt4 key购买 nike

我正在阅读 the documentation for File :

//..
let mut file = File::create("foo.txt")?;
//..

这一行的 ? 是什么?我不记得以前在 Rust Book 中见过它。

最佳答案

您可能已经注意到,Rust 没有异常(exception)。它有 panic ,但不鼓励将它们用于错误处理(它们用于不可恢复的错误)。

在 Rust 中,错误处理使用 Result .一个典型的例子是:

fn halves_if_even(i: i32) -> Result<i32, Error> {
if i % 2 == 0 {
Ok(i / 2)
} else {
Err(/* something */)
}
}

fn do_the_thing(i: i32) -> Result<i32, Error> {
let i = match halves_if_even(i) {
Ok(i) => i,
Err(e) => return Err(e),
};

// use `i`
}

这很棒,因为:

  • 在编写代码时,您不能不小心忘记处理错误,
  • 阅读代码时,您会立即发现这里可能存在错误。

然而,它并不理想,因为它非常冗长。这就是问号运算符 ? 的用武之地。

上面可以重写为:

fn do_the_thing(i: i32) -> Result<i32, Error> {
let i = halves_if_even(i)?;

// use `i`
}

这样更简洁。

What ? 这里的作用等同于上面的 match 声明加上一个。简而言之:

  1. 如果成功,它会解压Result
  2. 如果没有,它返回错误,调用From::from在错误值上可能将其转换为另一种类型。

这有点神奇,但错误处理需要一些魔法来减少样板文件,并且与异常不同的是,它立即可见哪些函数调用可能会或可能不会出错:那些装饰有 ? 的函数调用.

神奇的一个例子是这也适用于Option:

// Assume
// fn halves_if_even(i: i32) -> Option<i32>

fn do_the_thing(i: i32) -> Option<i32> {
let i = halves_if_even(i)?;

// use `i`
}

? 运算符,stabilized in Rust version 1.13.0由(不稳定)Try 提供支持特质。

另见:

关于rust - 这个问号运算符是关于什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42917566/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com