rust 使用?运算符时,如何在Some中 Package 结果错误?

lp0sw83n  于 2022-11-12  发布在  其他
关注(0)|答案(2)|浏览(98)

我有一个函数,它返回Option<Result<X, String>>,它调用了一些返回Result<Y, String>的函数。如何使用?运算符,它将错误 Package 在Some中?

fn other_func() -> Result<Y, String> {
    // ...
}

fn my_func() -> Option<Result<X, String>> {
    // ...
    let value = other_func()?;
    // ...
}

我有两个问题:

  • 我不知道如何将? Package 在Some
  • Result<X, String>Result<Y, String>不同,但由于我只关心此时的错误,所以这应该无关紧要

我可以通过组合匹配和返回来解决这个问题,但是如果可能的话,我想使用?。这是我目前的解决方案:

let value = match other_func() {
    Ok(value) => value,
    Err(msg) => return Some(Err(msg))
};
omqzjyyz

omqzjyyz1#

使用?运算符是不可能的,您必须执行当前的解决方案。
下面是有关?运算符的一些信息:https://doc.rust-lang.org/rust-by-example/std/result/question_mark.html-它只是语法上的糖

match <expr> {
  Ok(val) => val,
  Err(err) => {
    return Err(From::from(err))
  }
}

因此将Err Package 到Some(err)中的唯一方法是像之前那样手动匹配。

gcuhipw9

gcuhipw92#

您可以使用传回Result<Option<X>, String>的Helper函式或闭包,然后呼叫transpose()。例如:

fn my_func() -> Option<Result<X, String>> {
    (|| -> Result<Option<X>, String> {
        // ...
        let _value = other_func()?;
        // ...
        Ok(None)
    })()
    .transpose()
}

如果闭包的这种用法太模糊,可以简单地定义一个内部的fn helper()并调用helper().transpose()(或者在my_func外部定义帮助器)。

相关问题