为什么闭包在这里取得了向量的所有权?

时间:2017-03-01 14:49:27

标签: rust

生锈文档在Closures部分中有此示例。

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

let takes_nums = || nums;

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

文档说

  

如果您的关闭需要它,Rust将取得所有权和   移动环境

以上代码导致此错误

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的所有权。一样的   好像我们已经将nums传递给了一个拥有它的函数。

我不明白为什么闭包不只是借用向量的所有权,就像在本例中从文档那样借用

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

assert_eq!(10, plus_num(5));
  

这个闭包,plus_num,是指其范围内的let绑定:num。   更具体地说,它借用了绑定。

1 个答案:

答案 0 :(得分:4)

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

返回nums,其类型为Vec<i32>

为了让某人得到某种东西的所有权,你必须先拥有它,否则你不能给予它。同样的规则适用于关闭。