Есть ли способ сделать unwrap_or_return Ошибка (любая ошибка) - PullRequest
0 голосов
/ 31 января 2020

Есть ли способ упростить возврат в следующем примере (изначально скопирован с здесь ):

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)
}

1 Ответ

3 голосов
/ 01 февраля 2020

Вы ищете оператор вопросительного знака , возможно, в сочетании с Result::or или Result::or_else, в зависимости от особенностей вашего использования- case.

Этот пример кода может быть переписан как

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)
}

(детская площадка)

Если вы знаете, что собираетесь вернуться Ok в or_else, Result::unwrap_or более уместно. Проверьте другие подобные методы на Result, чтобы увидеть, что предлагается.

...