如果条件为假,我可以在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 中评估条件(三元)运算符

Java 逻辑运算符

Django 模板三元运算符

仅当 JavaScript 中的三元运算符中的条件为真时才赋值

条件与运算符

第二章 基础和运算符