介绍 ?
有时我们只想要 unwrap
的简洁性,而不希望出现 panic
的可能性。到目前为止,unwrap
迫使我们在真正想要的是将变量取出来时,不得不嵌套得越来越深。这正是 ?
的目的。
当遇到 Err
时,有两个有效的操作可以采取
panic!
,我们已经决定尽可能避免return
,因为Err
意味着它无法处理
?
几乎1 等同于一个在遇到 Err
时 return
而不是 panic
的 unwrap
。让我们看看如何简化前面使用组合器的例子
use std::num::ParseIntError; fn multiply(first_number_str: &str, second_number_str: &str) -> Result<i32, ParseIntError> { let first_number = first_number_str.parse::<i32>()?; let second_number = second_number_str.parse::<i32>()?; Ok(first_number * second_number) } fn print(result: Result<i32, ParseIntError>) { match result { Ok(n) => println!("n is {}", n), Err(e) => println!("Error: {}", e), } } fn main() { print(multiply("10", "2")); print(multiply("t", "2")); }
try!
宏
在 ?
出现之前,相同的功能是通过 try!
宏实现的。现在推荐使用 ?
运算符,但在查看旧代码时,您可能仍然会发现 try!
。使用 try!
的情况下,前面示例中的相同 multiply
函数如下所示
// To compile and run this example without errors, while using Cargo, change the value // of the `edition` field, in the `[package]` section of the `Cargo.toml` file, to "2015". use std::num::ParseIntError; fn multiply(first_number_str: &str, second_number_str: &str) -> Result<i32, ParseIntError> { let first_number = try!(first_number_str.parse::<i32>()); let second_number = try!(second_number_str.parse::<i32>()); Ok(first_number * second_number) } fn print(result: Result<i32, ParseIntError>) { match result { Ok(n) => println!("n is {}", n), Err(e) => println!("Error: {}", e), } } fn main() { print(multiply("10", "2")); print(multiply("t", "2")); }
1
有关更多详细信息,请参阅重新进入 ?。