我目前正在通过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中声明一个变量。为什么要选它来做完全不同的事情呢?
let
和if 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
)和背景的基本原理。