当前位置: 首页 > 知识库问答 >
问题:

为什么闭包会占据向量的所有权?

陆晓博
2023-03-14

防锈文件中的封闭部分有这个例子。

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

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

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

assert_eq!(10, plus_num(5));

这个闭包,加上_num,指的是其作用域中的let绑定:num。更具体地说,它借用了绑定。

共有1个答案

史阳晖
2023-03-14

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

它返回nums,其类型为Vec

要把某物的所有权给予某人,你必须首先拥有它,否则它就不是你可以给予的。同样的规则也适用于闭包。

 类似资料:
  • 问题内容: 这最终会消耗我所有的可用内存,然后进程被杀死。我曾尝试将标签从更改为“较小”标签,但这并没有什么不同。 我在做什么错/如何处理这个大文件? 我可以轻松地将其切碎并以较小的块进行处理,但这比我想要的还要难看。 问题答案: 当遍历整个文件时,将构建一棵树,并且不会释放任何元素。这样做的好处是元素可以记住其父元素是谁,并且您可以形成引用祖先元素的XPath。缺点是它会消耗大量内存。 为了在解

  • 我试图创建一个图,它将有V个顶点。我正在使用向量的向量来表示图(作为邻接列表)。我的图中的节点是从0到V-1的编号,所以adj向量的索引代表了节点的数量。除非我搞错了,adj[u]代表一个向量,所以我应该可以使用adj[u].push_back(v)将顶点v推入顶点u的邻接列表中。所以在我的例子中,adj[4]应该得到与节点4相邻的顶点所在的向量,而.push_back(1) 这不会发生的。我想这

  • 本文向大家介绍js 闭包 有什么作用?相关面试题,主要包含被问及js 闭包 有什么作用?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: (1)什么是闭包: 闭包是指有权访问另外一个函数作用域中的变量的函数。 闭包就是函数的局部变量集合,只是这些局部变量在函数返回后会继续存在。闭包就是就是函数的“堆栈”在函数返回后并不释放,我们也可以理解为这些函数堆栈并不在栈上分配而是在堆上分配。当在一个函

  • 问题内容: 我一直在阅读,在文件末尾使用PHP close标签是一种不好的做法。标头问题在以下情况下似乎无关紧要(这是迄今为止唯一的好参数): 现代版本的PHP在php.ini中设置了output_buffering标志。如果启用了输出缓冲,则可以在输出HTML之后设置HTTP标头和cookie,因为返回的代码不会立即发送到浏览器。 每本优秀实践书籍和Wiki均以该“规则”开头,但没有人提供充分的

  • 使用Flume源syslogudp,我看到大约25%的数据丢失。 这是我的配置 a1.sources = r1 a1.sinks=k1 a1 .通道= c1 a1.sources.r1.type = syslogudp a1.sources.r1.bind = 172.24.1.78 a1.sources.r1.port = 65535 a1.sinks.k1.type=文件滚动 水槽。水槽。目录

  • 我正在学习异步/等待,在阅读本文之后,不要阻塞异步代码 这是异步/等待适合于 IO 和 CPU 绑定的方法 我注意到@Stephen Cleary文章中的一个提示。 使用ConfigureAwait(false)避免死锁是一种危险的做法。您必须对阻塞代码调用的所有方法(包括所有第三方和第二方代码)的传递闭包中的每个等待使用ConfigureAwait(false)。使用ConfigureAwait