为什么闭包在这里要获取向量所有权?

4

在Rust的文档中,闭包部分有这个例子。

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个回答

5
答案在闭包签名中: takes_num 返回什么?
它返回类型为 Vec<i32>nums
要将某物的所有权转让给某人,必须先拥有它,否则它不是你的。同样的规则适用于闭包。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接