我正在处理一个写于几年前的 Rust 项目,遇到了下面这段文字:
let mut values = vec![];
for x in maybe_values {
if let Some(x) = x {
values.push(Arc::new(x));
}
}
我理解"if let"引入了一种模式匹配 if 的方式(似乎是对关键字"let"的糟糕重用,但我会克服这个问题——如果有人能帮我想出一个能让"let"在此处有意义的记忆技巧,请务必告诉我!)。
但是,测试Some(x) = x
是做什么的呢?
根据我的测试,它似乎是一种技巧或惯用法,既可以a)测试循环变量'x'是否为Some(),也可以b)最终以unwrap()的值结束在x中。
但我不能完全向自己解释它,也找不到任何地方提到这是一种惯用法。
希望你能帮助我学习Rust。谢谢。
Some(x)
中的x
是一个全新的变量,因此我认为使用let
是必要的。如果有什么问题,在匹配语句中模式匹配时缺少let
:match opt { Some(x) => {}, None => {} }
会创建一个没有let
的变量x
,如果x
也是作用域内的const
的名称,则可能会令人困惑。 - BallpointBenif Some(let x) = ...
,在 let 语句和参数声明中也是一样的。我知道有些人后悔没有在模式中使用变量匹配修饰符(例如let
)。 - Chayim Friedman