我有一个将 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()
只返回 a 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
实例value1
and value2
,所以我使用了这个or()
函数。
现在,由于我总是想要一个特定的错误而不是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))));