Rust Lang:“if let Some(x) = x”在做什么?

spe*_*ter 24 rust

我正在开发几年前编写的 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)

  • 如果我可以授予两个绿色勾号,我会;-)我从未想过“if let”在左侧创建新的内部变量。这有助于使“let”的使用更加清晰!说实话,当我开始阅读 Rust 代码时,“if let”语句对我来说是最奇怪的......谢谢。就我个人而言,我会尽量避免使用相同的变量名称 - “棘手的代码没有团队奖!” 恰恰相反... (2认同)

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