我可以在比赛中使用''吗?

问题描述 投票:7回答:3

我试图做一个简单的二次函数,通过枚举返回根数及其值:

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

rust match quadratic
3个回答
7
投票

你可以使用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),
}

7
投票

如果你想处理一些值大于,等于或小于另一个值的三种情况,你可以匹配一个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),
    }
}

3
投票

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声明。

© www.soinside.com 2019 - 2024. All rights reserved.