我可以在比赛中使用“<”和“>”吗?

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),
    }
}