我正在阅读以下文档File
:
//..
let mut file = File::create("foo.txt")?;
//..
什么是?
在这条线?我不记得以前在Rust Book中看到过它。
Answers:
您可能已经注意到,Rust没有例外。它有惊慌,但功能有限(不能携带结构化信息),不建议将其用于错误处理(它们意味着不可恢复的错误)。
在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`
}
这更加简洁。
这里?
所做的等同于match
上面的陈述。简而言之:Result
如果确定可以解压缩,否则返回错误。
这有点魔术,但是错误处理需要一些魔术来削减样板,并且与异常不同,它可以立即看到哪些函数调用可能会出错,也可能不会出错:那些装饰有?
。
魔术的一个例子是,它也适用于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`
}
这是由(不稳定)Try
特征支持的。
也可以看看:
Result
或Option
。