我试图做一个简单的二次函数,通过枚举返回根数及其值:
enum QuadraticResult {
None,
OneRoot(f32),
TwoRoots(f32, f32),
}
fn solveQuadratic(a: f32, b: f32, c: f32) -> QuadraticResult {
let delta = b * b - 4.0 * a * c;
match delta {
< 0 => return QuadraticResult::None,
> 0 => return QuadraticResult::TwoRoots(0.0, 1.0),
_ => return QuadraticResult::OneRoot(0.0),
}
}
这不会编译,因为它抱怨'<'和'>'。有没有办法用match
实现这一点,或者我需要使用if
你可以使用match guard,但这比简单的if
声明更加冗长:
return match delta {
d if d < 0 => QuadraticResult::None,
d if d > 0 => QuadraticResult::TwoRoots(0.0, 1.0),
_ => QuadraticResult::OneRoot(0.0),
}
如果你想处理一些值大于,等于或小于另一个值的三种情况,你可以匹配一个Ordering
,你可以通过调用cmp
(来自Ord
特征)或partial_cmp
(来自PartialOrd
特征)来获得。
fn solve_quadratic(a: f32, b: f32, c: f32) -> QuadraticResult {
let delta = b * b - 4.0 * a * c;
match delta.partial_cmp(&0.0).expect("I don't like NaNs") {
Ordering::Less => QuadraticResult::None,
Ordering::Greater => QuadraticResult::TwoRoots(0.0, 1.0),
Ordering::Equal => QuadraticResult::OneRoot(0.0),
}
}
You can,但是当你这样做时你会想要创建一个变量绑定并将它变成一个实际的表达式:
match delta {
d if d < 0.0 => QuadraticResult::None,
d if d > 0.0 => QuadraticResult::TwoRoots(0.0, 1.0),
_ => QuadraticResult::OneRoot(0.0),
}
我不确定这不仅仅是把它分成if
声明。