结果和选项展开

Fus*_*ion 3 rust

我正在尝试学习 Rust,我想了解概念基础。在 Rust 中,我们经常使用Result<T, E>作为返回类型。基本上,一种由 -Ok()和组成的类型,由Err()调用者来处理这些。

但令我感到惊讶的是,两者Ok()Err(), 再次有他们的“选项” -> 即SomeNone

示例代码:

fn integer_divide(a: u32, b: u32) -> Result<u32, String> {
  if b != 0 {
    Ok(a / b)
  } else {
    Err("Division by zero!".into())
  }
} 

let result = integer_divide(5, 0);

if(result.is_err()){
    if(result.err().is_some()){
        // some logic
    }
}
Run Code Online (Sandbox Code Playgroud)

所以基本上,我们需要在获得每个函数的结果值之前仔细检查(首先是 for Error Ok,然后是 for Someor None)?如果是的话,我觉得这很笨拙。尤其是在情况下我的integer_divide功能,我可以说哪里可靠,它永远不可能有结果Err()None值。

这对我来说更有意义,如果我们只是 unwrap Err(),然后检查它的值是None还是其他类型......特别是在我 100% 确定的情况下,它不能None保值。任何想法表示赞赏。

笔记

我知道?运营商的存在。我只是想了解概念。

pro*_*-fh 5

result.err()单独考虑,没有什么可以确保result实际包含错误,因此该方法无法在每次调用时返回错误。Rust 中提供一些可选的东西的通常方法是返回一个Option,因此是is_some()方法。这并不意味着Result包含这样的Option; 这Option是由err()方法创建的,以防万一result不包含错误。 知道内部实际上存在错误,result因为您之前使用result.is_err();进行了测试。但该err()方法的设计者很久以前并不知道is_err()在调用err().

result无需双重检查的通常处理方法是

    match result {
        Ok(v) => {
            println!("result is {}", v);
        }
        Err(e) => {
            println!("error: {}", e);
        }
    }
Run Code Online (Sandbox Code Playgroud)