在 Rust docs 中有一个关于并发的学习练习,代码如下:
let philosophers = vec![
Philosopher::new("Judith Butler"),
Philosopher::new("Gilles Deleuze"),
Philosopher::new("Karl Marx"),
Philosopher::new("Emma Goldman"),
Philosopher::new("Michel Foucault"),
];
let handles: Vec<_> = philosophers.into_iter().map(|p| {
thread::spawn(move || {
p.eat();
})
}).collect();
for h in handles {
h.join().unwrap();
}
他们简要解释了它的每个部分,但没有解释为什么在
move
调用中似乎有一个 thread::spawn()
指令和一个逻辑 OR:但是,这个“注释”看起来与其他注释(例如类型)不同。这里到底发生了什么,为什么? (搜索该代码片段似乎并没有指向任何地方,而是关于其他类型的
move
ing 的相同文档和其他博客文章。) 最佳答案
通过引用捕获的闭包采用 |ARGUMENTS| EXPRESSION
形式。
按值捕获的闭包采用 move |ARGUMENTS| EXPRESSION
形式。move
是目前仅在该位置使用的关键字。
有点不幸的是,不接受任何参数的闭包看起来像逻辑 OR 运算符,但这就是它的方式。它没有句法歧义。
关于syntax - `move ||` 习语的目的是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31912151/