因此,我正在学习Rust,我正在学习模式匹配和"if let"语句作为匹配表达式的替代方案.我看了this video个关于11点提到的"If let"的节目,他们给出了这个例子:

fn main() { 
     let some_value: Option<i32> = Some(3);
    
     if let Some(3) = some_value {
          println!("three");
     }
}

我知道,如果您只想匹配一个特定的模式,并且匹配的表达式太过冗长,那么这很有用,但如果是这样的话,您不能简单地这样做吗?

fn main() {
    let some_value: Option<i32> = Some(3);
    if some_value == Some(3) {
        println!("three");
    }
}

这个表达方式有没有比我不知道的"if let"更差的地方?

推荐答案

if let表单使您可以比您的示例更通用.除非定义了n,否则无法执行if some_value == Some(n),但您可以执行以下操作:

if let Some(n) = some_value { ... }

现在这给了你n分,你可以使用它.

我想,当您使用Rust More时,您会发现对于某些特定的值,Match Form Some(n)Some(1)出现的频率要高得多.

别忘了你也可以这样做:

if let Some(1) | Some(2) = some_value { ... }

如果不是像这样配对的话,用普通的if就麻烦多了:

if matches!(some_value, Some(1) | Some(2)) { ... }

因此,这里有一些有用的选项,它们可能更适合某些情况.

别忘了cargo clippy,它会指出是否有更好的方式来表达某事.

Rust相关问答推荐

为什么迭代器上的`. map(...)`的返回类型如此复杂?

为什么我需要在这个代码示例中使用&

将大小为零的类型实例存储到空指针中

有没有办法在Rust中配置常量变量的值?

函数内模块的父作用域的访问类型

Rust ndarray:如何从索引中 Select 数组的行

使用 select 处理 SIGINT 和子等待!无阻塞

为什么我必须使用 PhantomData?在这种情况下它在做什么?

如何强制匹配的返回类型为()?

在 Rust 中查找向量中 dyn struct 的索引

Rust:为什么 Pin 必须持有指针?

在Rust中实现Trie数据 struct 的更好方式

如何基于常量在Rust中跳过一个测试

Rust 打包在 .deb 中

如何在 Rust 中按 char 对字符串向量进行排序?

如何将这些测试放在一个单独的文件中?

bcrypt 有长度限制吗?

不能将 `*self` borrow 为不可变的,因为它也被borrow 为可变的 - 编译器真的需要如此严格吗?

预期类型参数,发现不透明类型

为移动和借位的所有组合实现 Add、Sub、Mul、Div