我正在尝试学习 Rust,我想了解概念基础。在 Rust 中,我们经常使用Result<T, E>作为返回类型。基本上,一种由 -Ok()和组成的类型,由Err()调用者来处理这些。
但令我感到惊讶的是,两者Ok()和Err(), 再次有他们的“选项” -> 即Some和None。
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保值。任何想法表示赞赏。
我知道?运营商的存在。我只是想了解概念。
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)
| 归档时间: |
|
| 查看次数: |
454 次 |
| 最近记录: |