【问题标题】:Is there any way of doing unwrap_or_return an Error (any error)有没有办法做 unwrap_or_return 一个错误(任何错误)
【发布时间】:2020-05-17 13:04:11
【问题描述】:

有没有什么办法可以简化下例中的返回(原文抄自here):

use std::num::ParseIntError;

fn multiply(first_number_str: &str, second_number_str: &str) -> Result<i32, ParseIntError> {
    let first_number = match first_number_str.parse::<i32>() {
        Ok(first_number)  => first_number,
        Err(e) => return Err(e),
    };

    let second_number = match second_number_str.parse::<i32>() {
        Ok(second_number)  => second_number,
        Err(e) => return Err(AnotherError::ParseError("error")),
    };

    Ok(first_number * second_number)
}

我的意思是这样的:

use std::num::ParseIntError;

fn multiply(first_number_str: &str, second_number_str: &str) -> Result<i32, ParseIntError> {
    let first_number = first_number_str.parse::<i32>()
        .unwrap_or_return(|e| Err(e));

    let second_number = second_number_str.parse::<i32>()
        .unwrap_or_return(|e| Err(AnotherError::ParseError("error"));

    Ok(first_number * second_number)
}

【问题讨论】:

  • 这类似于:stackoverflow.com/questions/51344951/… 但不完全一样。
  • AnotherError::ParseError 到底是什么?返回类型表明它的类型为ParseIntError
  • 你说得对,它更像是伪代码。我的意思是返回可能是另一个错误甚至是好的(某事)。

标签: rust return unwrap


【解决方案1】:

您正在寻找question mark operator,可能与Result::orResult::or_else 结合使用,具体取决于您的用例的具体情况。

该代码示例可以重写为

use std::num::ParseIntError;

pub fn multiply(first_number_str: &str, second_number_str: &str) -> Result<i32, ParseIntError> {
    let first_number = first_number_str.parse::<i32>()?;
    let second_number = second_number_str.parse::<i32>().or_else(|e| Err(e))?;
    // The closure in `or_else` could also return `Ok` or some different error with type `ParseIntError`.
    // let second_number = second_number_str.parse::<i32>().or_else(|_e| Ok(27))?;

    Ok(first_number * second_number)
}

(playground)

如果您知道要在or_else 中返回Ok,则Result::unwrap_or 更合适。查看Result 上的其他类似方法,了解提供了什么。

【讨论】:

  • 如果您从or_else 返回Err,那么改用map_err 可能会更干净。
  • unwrap_or 不会从函数返回。 unwrap_or_return 一个好的作为失败的“早期回报”是目的之一。
  • 例如,如果first_numbersecond_number无效,请尽早返回Ok(0)!
  • @Omid 关键是? 运算符,它确实从函数返回。
  • @SCappella 不是真的。看看这个:play.rust-lang.org/…
猜你喜欢
  • 2021-02-24
  • 1970-01-01
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多