2017-03-01 48 views
2

生锈的文档在Closures部分有这个例子。为什么闭包在这里拥有这个向量的所有权?

let nums = vec![1, 2, 3]; 

let takes_nums = || nums; 

println!("{:?}", nums); 

文档说

如果您关闭需要它,但是,鲁斯特将采取所有权和 移动环境而不是

而且上面的代码会导致此错误

note: `nums` moved into closure environment here because it has type 
    `[closure(()) -> collections::vec::Vec<i32>]`, which is non-copyable 
let takes_nums = || nums; 
       ^~~~~~~ 

其中的文档说

Vec对其内容拥有所有权,因此,当我们在我们的封闭中引用 时,我们必须获得所有权。这与 一样,就好像我们已经将nums传递给了一个拥有它的所有权的函数。

我不明白为什么封不只是借用载体的所有权,因为它在这个例子,从文档

let num = 5; 
let plus_num = |x: i32| x + num; 

assert_eq!(10, plus_num(5)); 

此次关闭,plus_num,指让它在其范围内绑定:num。 更具体地说,它借用了绑定。

回答

3

答案在于关闭的签名:takes_num返回什么?

返回nums,类型为Vec<i32>

要给某人所有权,你必须先拥有它,否则它不是你的。同样的规则适用于封闭。