我有以下代码:
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!()
}