- 关于
Result
的map
关于 Result
的 map
前面关于 panic 例子,提供给我们的是一个无用的错误消息。为了避免这样,我们需要更具体地指定返回类型。在那个例子中,该常规元素为 i32
类型。
为了确定 Err
的类型,我们可以借助 parse()
,它使用 FromStr
trait 来针对 i32
实现。结果是,Err
类型被指定为 ParseIntError
。
在下面例子中要注意,使用简单的 match
语句会导致更加繁琐的代码。事实证明,用到 Option
的 map
方法也对 Result
进行了实现。
幸运的是,Option
的 map
方法是对 Result
进行了实现的许多组合算子之一。 enum.Result
包含一个完整的列表。
use std::num::ParseIntError;
// 返回类型重写之后,我们使用模式匹配,而不使用 `unwrap()`。
fn double_number(number_str: &str) -> Result<i32, ParseIntError> {
match number_str.parse::<i32>() {
Ok(n) => Ok(2 * n),
Err(e) => Err(e),
}
}
// 就像 `Option`,我们可以使用组合算子,如 `map()`。
// 此函数在其他方面和上述的示例一样,并表示:
// 若值有效则修改 n,否则传递错误。
fn double_number_map(number_str: &str) -> Result<i32, ParseIntError> {
number_str.parse::<i32>().map(|n| 2 * n)
}
fn print(result: Result<i32, ParseIntError>) {
match result {
Ok(n) => println!("n is {}", n),
Err(e) => println!("Error: {}", e),
}
}
fn main() {
// 这里仍然给出一个合理的答案。
let twenty = double_number("10");
print(twenty);
// 下面提供了更加有用的错误消息。
let tt = double_number_map("t");
print(tt);
}