我可以在比赛中使用“<”和“>”吗?
Can I use '<' and '>' in match?
我正在尝试做一个简单的二次函数,它将 return 根的数量及其通过枚举的值:
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),
}
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
语句更好。
如果你想处理某个值大于、等于或小于另一个的三种情况,你可以匹配一个Ordering
,你可以通过调用cmp
(from the Ord
trait) or partial_cmp
(from the PartialOrd
trait获得).
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),
}
}
我正在尝试做一个简单的二次函数,它将 return 根的数量及其通过枚举的值:
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),
}
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
语句更好。
如果你想处理某个值大于、等于或小于另一个的三种情况,你可以匹配一个Ordering
,你可以通过调用cmp
(from the Ord
trait) or partial_cmp
(from the PartialOrd
trait获得).
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),
}
}