为什么 if-let 中有 let 关键字?

问题描述

我目前正在通过 rustbook 学习 Rust,到目前为止我没有遇到任何问题,但是 if-let 对我来说毫无意义。我想我有点明白它的作用,但语法对我来说似乎不合逻辑,这阻碍了我使用它。

Question 解释了 if-let 之间的差异,但我阅读了答案,但我仍然无法理解。 我不明白为什么选择这种语法。

从我链接的问题中接受的答案有一些例子:

if let Foo::Bar = a {
    println!("a is foobar");
}

我的第一个想法是使用 let 是因为我们有点声明一个临时变量并将 a 分配给它,如果可能的话,执行 if 块。那对我来说很有意义。 但后来我读了接下来的两个例子:

if let Foo::Qux(value) = c {
    println!("c is {}",value);
} 
if let Foo::Qux(value @ 100) = c {
    println!("c is one hundred");
}

术语 let Foo::Qux(value)let Foo::Qux(value @ 100) 在我看来是错误的。据我所知,我不能声明这样的变量。

这里发生了什么?

我知道模式匹配,但 let 关键字让我觉得有些东西我没有得到。

我对 let mypattern = myvariable 基本上是 fn rusts_patternmatching(mypattern,myvariable) ->bool 并且语法只是让我感到困惑吗?为什么当时选择了 let 关键字?


评论区: 据我了解,它与对一只手臂的模式匹配基本相同。但是 let 关键字对我来说表达这一点似乎是错误的,以至于我觉得我脑子里的概念从根本上是错误的。对我来说,“let”用于在 rust 中声明一个变量。为什么选择这里是为了完全不同的东西?

解决方法

letif let 都作用于一个 Pattern;名称分配是匹配模式的副作用。例如,let (a,b) = (1,2)(1,2) 与模式 (a,b) 匹配。

区别在于 let 是一个必需(“无可辩驳”)匹配,而 if let 是一个可能(“可辩驳”)匹配。不匹配模式的可能性用if表示。

fn main() {
    // don't do this at home
    if let (a,2) {
        println!("{} {}",a,b);
    };
}

另请参阅 RFC 160: if let,了解将 if let 创建为条件 (if) 模式匹配 (let) 和背景的基本原理。