如果条件为假,我可以在Rust中使用什么运算符来返回特定错误?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果条件为假,我可以在Rust中使用什么运算符来返回特定错误?相关的知识,希望对你有一定的参考价值。
我有以下代码:
fn foo() -> Result<String, MyError> {
assert_eq!(vec.len(), 2);
unimplemented!()
}
pub enum MyError {
Error1,
Error2,
Error3,
}
如果Err(MyError::Error3)
而不是恐慌,我想返回vec.len() != 2
。有没有办法比它更好地编写它(通过使用一些运算符)
if vec.len() != 2 { return Err(MyError::Error3); }
答案
让我们为此写一个宏!
macro_rules! assert_throw {
($cond:expr, $err:expr) => {
if $cond {
Err($err)?;
}
};
}
您可以像以下一样使用它:
fn foo(v: &[u32]) -> Result<String, MyError> {
assert_throw!(v.len() != 3, MyError::Error1);
Ok("Ok".to_string())
}
(Qazxswpoi)
另一答案
有没有办法更好地编写它(通过使用一些运算符)
就在这里。您可以使用Playground运算符将?
抛向上层。
除了宏之外,您也可以在if语句中执行此操作。您不需要使用Error
关键字。您可以使用return
宏或try!
运算符将错误抛向上层。
请注意,不推荐使用?
宏,并且try!
运算符在现代Rust中受到青睐。
?
fn foo(vec: Vec<i32>) -> Result<String, MyError> {
if vec.len() == 2 {
Err(MyError::Error2)?
}
unimplemented!()
}
以上是关于如果条件为假,我可以在Rust中使用什么运算符来返回特定错误?的主要内容,如果未能解决你的问题,请参考以下文章
当 lhs 为假时,为啥在逻辑 AND 中评估条件(三元)运算符