0

a を数値に解析し、strそれまたはエラーを返す関数があります

fn parse_str<T: FromStr>(text: &str) -> Result<T, SaleError> {
    match text.parse::<T>() {
        Ok(value) => Ok(value),
        _ => Err(SaleError::new(6010, 1999)),
    }
}

SaleError私のカスタムエラー構造体です。

解析後、結果値で他のチェックを行いたいです。たとえば、数値が で正かどうかをチェックしis_sign_positive()、そうでない場合は を発行しErr(SaleError)ます。

is_sign_positive()のみを返すため、bool私が行ったことは、この関数を作成することでした:

fn is_positive(number: f64) -> Result<f64, SaleError> {
    match number.is_sign_positive() {
        true => Ok(number),
        false => Err(SaleError::new(6010, 1999)),
    }
}

今、私はそれを次のように使用できます:

let value1 = try!(parse_str::<f64>("123").and_then(is_positive)
                  .or(Err(SaleError::new(6010, 1465))));
let value2 = try!(parse_str::<f64>("321").and_then(is_positive)
                  .or(Err(SaleError::new(6010, 5000))));

これはうまく機能しますが、との特定のSaleErrorインスタンスが必要なので、関数を使用したことに注意してください。value1value2or()

さて、私は常に特定のエラーがis_positive返されるのではなく、特定のエラーis_sign_positive()が必要になるので、関数を作成せずに使用できるようにラップすることは可能is_positiveですか?

そんな感じ:

let value1 = try!(parse_str::<f64>("123").check_if(|n| n.is_sign_positive())
                  .or(Err(SaleError::new(6010, 1465))));
4

1 に答える 1