Hrk*_*kkl 5 pattern-matching rust
我目前正在通过 rustbook 学习 Rust,到目前为止我没有遇到任何问题,但 if-let 对我来说没有任何意义。我想我有点明白它的作用,但语法对我来说似乎不合逻辑,这阻碍了我使用它。
这个问题解释了 if-let 之间的差异,但我读了答案,但仍然无法理解。我不明白为什么选择这种语法。
我链接的问题中接受的答案有一些例子:
if let Foo::Bar = a {
println!("a is foobar");
}
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是使用 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");
}
Run Code Online (Sandbox Code Playgroud)
这些条款对我来说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在同一个模式上工作;名称分配是匹配模式的副作用。例如,let (a, b) = (1, 2)匹配(1, 2)模式(a, b)。
区别在于let是必需的(“不可反驳的”)匹配,而if let是可能的(“可反驳的”)匹配。不匹配模式的可能性用 表示if。
fn main() {
// don't do this at home
if let (a, b) = (1, 2) {
println!("{} {}", a, b);
};
}
Run Code Online (Sandbox Code Playgroud)
另请参阅RFC 160:if letif let了解创建条件 ( if) 模式匹配 ( ) 和背景的基本原理let。