`move ||`成语的目的是什么?

时间:2015-08-10 05:26:49

标签: syntax concurrency rust

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的原因:

  

这个闭包需要一个额外的注释,移动,以表明闭包将取得它捕获的值的所有权。

然而,这个&#39;注释&#39;看起来不像其他注释,例如类型。这里到底发生了什么,为什么? (搜索该代码片段似乎并没有指向任何地方,但有关其他类型的move的相同文档和其他博客文章。)

1 个答案:

答案 0 :(得分:10)

通过引用捕获的闭包的形式为 library(stringr) fruits[str_detect(fruits, wanted.string)] #[1] "apple" "banana" "pineapple"

按值捕获的闭包的格式为|ARGUMENTS| EXPRESSION move |ARGUMENTS| EXPRESSION是目前仅在该位置使用的关键字。

有点不幸的是,一个不接受任何参数的闭包看起来像逻辑OR运算符,但这就是它的方式。它没有语法歧义。