我正在开发几年前编写的 Rust 项目,并且遇到了这段代码,其字面意思是:
let mut values = vec![];
for x in maybe_values {
if let Some(x) = x {
values.push(Arc::new(x));
}
}
Run Code Online (Sandbox Code Playgroud)
我知道“if let”引入了模式匹配 if (这似乎是对关键字“let”的糟糕重用,但我会克服这一点 - 如果有人可以帮助我用心理助记符来理解“让”在这里,请这样做!)。
但测试在Some(x) = x做什么?
从我的测试来看,这似乎是一个技巧/习惯用法:a) 测试循环变量“x”是 Some(),b) 最终得到 x 中的 unwrap()ped 值。
但我无法向自己完全解释它,也无法在任何地方找到关于这是一个习语的参考。
希望你能帮助我的 Rust 教育之路。谢谢。
Loc*_*cke 24
这是当您只关心匹配单个用例时使用完整匹配语句的简写。
所以这段代码:
if let x = y {
foo();
} else {
bar();
}
Run Code Online (Sandbox Code Playgroud)
相当于使用完整匹配:
match y {
x => {
foo();
}
_ => {
bar();
}
}
Run Code Online (Sandbox Code Playgroud)
对于您的具体情况,它与此等效。内部 x 使用与外部变量相同的名称,这可能会造成混淆,但它们是两个单独的值。
let mut values = vec![];
for x in maybe_values {
match x {
Some(y) => values.push(Arc::new(y)),
_ => {},
}
}
Run Code Online (Sandbox Code Playgroud)
Sil*_*olo 14
这里有两个完全不同的变量在起作用。它相当于。
let mut values = vec![];
for x_1 in maybe_values {
if let Some(x_2) = x_1 {
values.push(Arc::new(x_2));
}
}
Run Code Online (Sandbox Code Playgroud)
在 Rust 中,a 的右侧是用不在let范围内的左侧变量来计算的,因此当计算 a 时,外部仍然在范围内。然后,如果它是一个值,我们创建一个新变量,其中包含.该变量遮蔽了前一个变量,使其在语句内不可访问(就像调用的函数参数将通过遮蔽呈现名为不可访问的全局变量一样)。if letxSomexOptionxifxx
| 归档时间: |
|
| 查看次数: |
17905 次 |
| 最近记录: |