如果条件为假,我可以在Rust中使用什么运算符来返回特定错误?

问题描述 投票:-2回答:2

我有以下代码:

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); }
rust
2个回答
4
投票

让我们为此写一个宏!

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)


1
投票

有没有办法更好地编写它(通过使用一些运算符)

就在这里。您可以使用Playground运算符将?抛向上层。

除了宏之外,您也可以在if语句中执行此操作。您不需要使用Error关键字。您可以使用return宏或try!运算符将错误抛向上层。

请注意,不推荐使用?宏,并且try!运算符在现代Rust中受到青睐。

?

fn foo(vec: Vec<i32>) -> Result<String, MyError> { if vec.len() == 2 { Err(MyError::Error2)? } unimplemented!() }

© www.soinside.com 2019 - 2024. All rights reserved.