什么时候我应该在match块中使用std::cmp::ordering而不是使用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.");
    }
}
  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. 你不能意外地忘记一个 case ,它保证是详尽无遗的.
  2. 条件只写一次,不需要"反转"它或任何东西.

因此,ifmatch实际上是不同输出的数量问题:

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

matchif/else链条更容易维护.


Note: I personally think that 100 is rarely used directly. It is more meant as an implementation device, allowing you to implement a single function to get all 4 inequality operators. Coming from C++, it's a relief...

Rust相关问答推荐

为什么是!为Rust中的RwLockReadGuard和RwLockWriteGuard实现的发送特征?

什么是Rust惯用的方式来使特征向量具有单个向量项的别名?

有没有可能让泛型Rust T总是堆分配的?

解析程序无法在Cargo 发布中 Select 依赖版本

如何将生存期参数添加到框<>;具有dyn类型别名

`actix-web` 使用提供的 `tokio` 运行时有何用途?

期望一个具有固定大小 x 元素的数组,找到一个具有 y 元素的数组

找不到 .has_func 或 .get_func 的 def

Rust 1.70 中未找到 Trait 实现

使用在功能标志后面导入的类型,即使未启用功能标志

从 Rust 中的 if/else 中的引用创建 MappedRwLockWriteGuard

返回迭代器的特征

Rust/Serde/HTTP:序列化`Option`

If let expression within .iter().any

tokio async rust 的 yield 是什么意思?

为什么这个闭包没有比 var 长寿?

在 Rust 中有条件地导入?

如何从 Rust 中不同类型的多个部分加入 Path?

为什么这个 Trait 无效?以及改用什么签名?

缓存自引用函数导致 Rust