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

问题描述 投票:8回答:1

什么时候应该在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.");
    }
}
if-statement rust comparison
1个回答
11
投票

可读性是唯一的区别吗?

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

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

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

因此,if vs match确实是一个不同输出的问题:

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

matchif / else链更易维护。


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

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