为什么闭包在这里拥有向量的所有权?

Sph*_*Cow 4 rust

Rust 文档在Closures部分有这个例子。

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

let takes_nums = || nums;

println!("{:?}", nums);
Run Code Online (Sandbox Code Playgroud)

文档说

但是,如果您的关闭需要它,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;
                 ^~~~~~~
Run Code Online (Sandbox Code Playgroud)

文档说

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

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

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

assert_eq!(10, plus_num(5));
Run Code Online (Sandbox Code Playgroud)

这个闭包,plus_num,在它的作用域中引用了一个 let 绑定:num。更具体地说,它借用了绑定。

Mat*_* M. 5

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

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

要将某物的所有权授予某人,您必须首先拥有它,否则就不能给予。同样的规则适用于关闭。