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



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

这个问题解释了if和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关键字对我来说似乎是错误的表达,我觉得我对我头脑中的概念从根本上是错误的。给我"让";用于在rust中声明一个变量。为什么要选它来做完全不同的事情呢?

letif let都在一个图案上工作;名称赋值是匹配模式的副作用。例如,let (a, b) = (1, 2)(1, 2)匹配到模式(a, b)

区别在于let必需的("irrefutable")匹配,而if let可能的("refutable")匹配。不匹配模式的可能性用if表示。

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

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

最新更新