我在做一个几年前写的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)以x中的unwrap()ped值结束.

但我不能完全向自己解释,也找不到任何地方提到这是一个习语.

希望你能帮助我走上正确的教育道路.谢谢

推荐答案

这里有两个完全不同的变量.这相当于.

let mut values = vec![];
for x_1 in maybe_values {
  if let Some(x_2) = x_1 {
    values.push(Arc::new(x_2));
  }
}

在Rust中,let的右侧在范围内使用左侧变量not进行计算,因此当计算if let时,外部变量x仍在范围内.然后,如果它是一个Some的值,我们做一个new变量x,它包含Option的内部.这个变量shadows是前一个x,使其在if语句中不可访问(与名为x的函数参数通过阴影使名为x的全局变量不可访问的方式相同).

Rust相关问答推荐

在Rust中创建可变片段的可变片段的最有效方法是什么?

无法在线程之间安全地发送future (&Q;)&错误

如何使用Match比较 struct 中的值

如何将`Join_all``Vec<;Result<;Vec<;Foo&>;,Anywhere::Error&>;`合并到`Result<;Vec<;Foo&>;,Anywhere::Error&>;`

当rust中不存在文件或目录时,std::FS::File::Create().unwire()会抛出错误

异步FN中的 rust 递归

什么时候铁 rust FFI边界上的panic 是未定义的行为?

有没有办法避免在While循环中多次borrow `*分支`

交换引用时的生命周期

Gtk4-rs:将监视器作为gdk::monitor获取,而不是作为glib::对象获取

将serde_json读入`VEC<;T&>;`( rust 色)时出现问题

了解Rust';s特征对象和不同函数签名中的生存期注释

try 从标准输入获取用户名和密码并删除 \r\n

为什么 Rust 字符串没有短字符串优化 (SSO)?

从Rust 的临时文件中创建引用是什么意思?

bcrypt 有长度限制吗?

使用 `clap` 在 Rust CLI 工具中设置布尔标志

为什么我可以同时传递可变和不可变引用?

将一片字节复制到一个大小不匹配的数组中

相互调用的递归异步函数:检测到循环