关于 Resultmap

前面关于 panic 例子,提供给我们的是一个无用的错误消息。为了避免这样,我们需要更具体地指定返回类型。在那个例子中,该常规元素为 i32 类型。

为了确定 Err 的类型,我们可以借助 parse(),它使用 FromStr trait 来针对 i32 实现。结果是,Err 类型被指定为 ParseIntError

在下面例子中要注意,使用简单的 match 语句会导致更加繁琐的代码。事实证明,用到 Optionmap 方法也对 Result 进行了实现。

幸运的是,Optionmap 方法是对 Result 进行了实现的许多组合算子之一。 enum.Result 包含一个完整的列表。

  1. use std::num::ParseIntError;
  2. // 返回类型重写之后,我们使用模式匹配,而不使用 `unwrap()`。
  3. fn double_number(number_str: &str) -> Result<i32, ParseIntError> {
  4. match number_str.parse::<i32>() {
  5. Ok(n) => Ok(2 * n),
  6. Err(e) => Err(e),
  7. }
  8. }
  9. // 就像 `Option`,我们可以使用组合算子,如 `map()`。
  10. // 此函数在其他方面和上述的示例一样,并表示:
  11. // 若值有效则修改 n,否则传递错误。
  12. fn double_number_map(number_str: &str) -> Result<i32, ParseIntError> {
  13. number_str.parse::<i32>().map(|n| 2 * n)
  14. }
  15. fn print(result: Result<i32, ParseIntError>) {
  16. match result {
  17. Ok(n) => println!("n is {}", n),
  18. Err(e) => println!("Error: {}", e),
  19. }
  20. }
  21. fn main() {
  22. // 这里仍然给出一个合理的答案。
  23. let twenty = double_number("10");
  24. print(twenty);
  25. // 下面提供了更加有用的错误消息。
  26. let tt = double_number_map("t");
  27. print(tt);
  28. }