Rust 我可以使用'<';和'&燃气轮机';比赛中?

Rust 我可以使用'<';和'&燃气轮机';比赛中?,rust,match,quadratic,Rust,Match,Quadratic,我尝试使用一个简单的二次函数,通过枚举返回根数及其值: 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 => re

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

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),
    }
}
enum quardicresult{
没有一个
一根(f32),
两个根(f32,f32),
}
fn解算二次型(a:f32,b:f32,c:f32)->二次型结果{
设δ=b*b-4.0*a*c;
匹配三角洲{
<0=>返回quardicResult::无,
>0=>返回平方结果::两个根(0.0,1.0),
_=>返回平方结果::OneRoot(0.0),
}
}
这不会编译,因为它会抱怨“”。有没有办法通过
match
实现这一点,或者我需要使用
如果

您可以使用,但这比简单的
如果
语句更冗长:

return match delta {
    d if d < 0 => QuadraticResult::None,
    d if d > 0 => QuadraticResult::TwoRoots(0.0, 1.0),
    _   => QuadraticResult::OneRoot(0.0),
}
返回匹配增量{
如果d<0=>quardicResult::无,
d如果d>0=>quardicResult::TwoRoots(0.0,1.0),
_=>quardicresult::OneRoot(0.0),
}
,但您需要在创建变量绑定时将其转换为实际表达式:

match delta {
    d if d < 0.0 => QuadraticResult::None,
    d if d > 0.0 => QuadraticResult::TwoRoots(0.0, 1.0),
    _ => QuadraticResult::OneRoot(0.0),
}
匹配增量{
如果d<0.0=>quardicResult::无,
d如果d>0.0=>quardicresult::TwoRoots(0.0,1.0),
_=>quardicresult::OneRoot(0.0),
}

不过,我不确定这是否比将其拆分为一个
if
语句要好。

如果您想处理某个值大于、等于或小于另一个值的三种情况,您可以匹配
排序
,您可以通过调用(从trait)或(从trait)获得该排序


谢谢你,西蒙。我将不得不接受雅各布的回答,因为他是第一个:)哦,没问题。我没看到雅各布回答。。。哈,它们也几乎一模一样!我也可以删除我的。只是想补充一点,在这种情况下,我肯定更喜欢'match'而不是'if/else'语句,因为代码看起来更整洁、可读性更好。我想到了另一件事。“if/else”和“match”之间是否有任何明显的性能差异?@dawid即使在性能上有任何差异,也不能保证在下一版本中保持不变。如果你不是被迫这样做的话,你就不应该为这个级别的性能而烦恼。首先是可读性——优化是编译器的工作。惯用的Rust使用
snake\u case
作为标识符<代码>求解二次型
求解二次型
@Shepmaster好点。幸运的是,用于Visual Studio代码的rls插件在我能够编译它之后也为我标记了它。:)我想您最终会用计算值替换
0.0
1.0
。小心不要假设,当返回
quardicresult::TwoRoots(x,y)
时,
x!=y
。即使
d
大于0,
-b+d.sqrt()
-b-d.sqrt()
可能仍然相同,但它也可能发生在有限根的情况下。您可能希望返回
选项
,并让调用者决定
x1
x2
是否“足够接近”以被视为单个根。
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),
    }
}