首页 文章

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

提问于
浏览
3

生锈文档在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 回答

  • 4

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

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

    为了让某人拥有某种东西,你必须首先拥有它,否则你不应该给予它 . 同样的规则适用于关闭 .

相关问题