我正在开发几年前编写的 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 教育之路。谢谢。
我不明白我们使用的原因if let,只是通常的if. 在 Rust 书的第 6.3 章中,示例代码如下:
let some_u8_value = Some(0u8);
if let Some(3) = some_u8_value {
println!("three");
}
Run Code Online (Sandbox Code Playgroud)
上面的代码与:
let some_u8_value = Some(0u8);
if Some(3) == some_u8_value {
println!("three");
}
Run Code Online (Sandbox Code Playgroud)
关于我们为什么要使用if let它或它专门用于什么的任何其他原因?
在 Rust 中,您可以在解包时使用if let而不是match直接使用一个简单的值。
所以代替
match opt_val {
Some(x) => {
do_something_with(x);
}
_ => {}
}
Run Code Online (Sandbox Code Playgroud)
if let Some(x) = opt_val {
do_something_with(x);
}
Run Code Online (Sandbox Code Playgroud)
我应该如何在心理上阅读或处理这段代码?对于match,这很简单:“如果opt_val是匹配的Some(x),然后做......用x”。
因为if let我总是觉得这是错误的方式:“如果Some(x)匹配(?)opt_val,那么做......”。请注意,let这句话中没有。
这没什么大不了的,但我继续绊倒这个。
我真的很喜欢“如果这让绑定成功,那么...... ”来自接受的答案,因为我认为它设置了正确的焦点。过多地关注模式匹配首先让我陷入了这个“问题”。作为参考,(IR)可反驳和let讨论这里的锈的书。