原文在这 下面代码源于原文,但有改动。
mod checked {
#[derive(Debug)]
pub enum MathError {
DivisionByZero,
NegativeSquareRoot,
}
pub type MathResult = Result<f64, MathError>;
fn div(x:f64, y:f64) -> MathResult {
if y < 0.00000001 {
Err(MathError::DivisionByZero)
} else {
Ok(x/y)
}
}
fn sqrt(x: f64) -> MathResult {
if x < 0.0 {
Err(MathError::NegativeSquareRoot)
} else {
Ok(x.sqrt())
}
}
pub fn op(x: f64, y: f64) -> MathResult {
// 如果 `div` “失败” 了,那么返回 `DivisionByZero`
let ratio = div(x, y)?;
println!("ratio is {}", ratio);
sqrt(ratio)
}
}
fn main() {
let ret = checked::op(10.0, 2.0);
//let ret = checked::op(1.0, 0.0);
//let ret = checked::op(-10.0, 2.0);
match ret {
checked::MathResult::Ok(v) => println!("{}", v),
checked::MathResult::Err(e) => println!("error:{:?}", e),
}
}