问题描述
我目前正在通过 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 中声明一个变量。为什么选择这里是为了完全不同的东西?
解决方法
let
和 if 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
) 和背景的基本原理。