什么时候应该在std::cmp::ordering
块中使用match
而不是使用if
/ else if
声明?可读性是唯一的区别吗?
例如:
use std::cmp::Ordering;
fn main() {
match 2.cmp(&2) {
Ordering::Less => println!("Less than 2."),
Ordering::Greater => println!("Greater than 2."),
Ordering::Equal => println!("Equal to 2."),
}
}
与
fn main() {
if 1 < 2 {
println!("less than 2.");
} else if 1 > 2 {
println!("Greater than 2.");
} else if 1 == 2 {
println!("Equal to 2.");
}
}
可读性是唯一的区别吗?
我会说这更像是干(不要重复自己)的事情。
如果你看第二个样本,那就太乱了:
fn main() { if 1 < 2 { println!("less than 2."); } else if 1 > 2 { println!("Greater than 2."); } else if 1 == 2 { println!("Equal to 2."); } }
else
条款。如果你搞砸了条件,它就什么都不做。else
条款,你最好还是把assert!(1 == 2)
放在里面,以确保它只在两者相等时才采取(而不是因为你在之前的条件中犯了错误)。1 < 2
和1 > 2
之间重复一遍。与match
相比:
fn main() { match 2.cmp(&2) { Ordering::Less => println!("Less than 2."), Ordering::Greater => println!("Greater than 2."), Ordering::Equal => println!("Equal to 2."), } }
因此,if
vs match
确实是一个不同输出的问题:
if
,match
。match
比if
/ else
链更易维护。
注意:我个人认为cmp
很少直接使用。它更像是一个实现设备,允许您实现一个函数来获取所有4个不等式运算符。来自C ++,这是一种解脱......