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