我正在尝试学习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
}
}
因此,基本上,我们需要仔细检查一下才能得出每个函数的结果值(首先是Err
或Ok
,然后是forSome
或None
)?如果是,我觉得这很笨拙。尤其是在情况下我的integer_divide
功能,我可以说哪里可靠,它永远不可能有结果Err()
的None
值。
对我来说,如果我们只是解开包装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);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句