何时在Rust中使用`std :: cmp :: ordering`而不是`if`语句

kan*_*roo 8 comparison if-statement rust

什么时候应该std::cmp::orderingmatch块中使用而不是使用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."),
    }
}
Run Code Online (Sandbox Code Playgroud)

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.");
    }
}
Run Code Online (Sandbox Code Playgroud)

Mat*_* M. 14

可读性是唯一的区别吗?

我会说这更像是干(不要重复自己)的事情.

如果你看第二个样本,那就太乱了:

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.");
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 没有else条款.如果你搞砸了条件,它就什么都不做.
  2. 如果最后一个是一个else子句,你最好放一个assert!(1 == 2)内部来确保它只在两者相等时才采取(而不是因为你在之前的条件中犯了错误).
  3. 即便如此,你仍然会在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."),
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 你不能不小心忘记案件,它保证是详尽无遗的.
  2. 条件只写一次,不需要"反转"它或任何东西.

因此,ifvs match实际上是多个不同输出的问题:

  • 使用if如果有一个或两个分支,
  • match如果有三个分支或更多分支,请使用

A matchif/ elsechain 更易于维护.


注意:我个人认为cmp很少直接使用.它更像是一个实现设备,允许您实现一个函数来获取所有4个不等式运算符.来自C++,这是一种解脱......

  • "来自C++,这是一种解脱......",他们正在尝试:[C++ 20中的太空船运营商](http://en.cppreference.com/w/cpp/language/operator_comparison#Three-way_comparison ) (3认同)