gpt4 book ai didi

rust - 在结构中迭代 Vec - 无法移出借用的内容

转载 作者:行者123 更新时间:2023-11-29 07:43:02 25 4
gpt4 key购买 nike

我正在为包含 Vec 的结构编写一个函数,我试图在其中迭代 Vec:

struct Object {
pub v: Vec<f32>,
}

impl Object {
pub fn sum(&self) -> f32 {
let mut sum = 0.0;
for e in self.v {
sum += e;
}
sum
}
}

但是我得到以下错误:

error[E0507]: cannot move out of borrowed content
--> src/lib.rs:8:18
|
8 | for e in self.v {
| ^^^^ cannot move out of borrowed content

我的理解是,由于 self 是借用的,for 循环迭代试图将 v 的元素移出到 e 中。

从错误代码中,我读到一个潜在的解决方案是取得所有权,但我不太确定该怎么做。

我不是要修改矢量或其元素。我只想使用这些元素来运行一些计算。

最佳答案

这行:for e in self.v 本质上是说for e in (*self).v;你试图通过移动迭代向量,调用它的 IntoIterator特征。这会完全破坏矢量,将所有数字永远移出它,这不仅不是您想要的,而且在这种情况下也是不允许的,因为您只被允许读取它。

您实际上想通过引用迭代它。有两种方法可以做到这一点:

for e in &self.v {
// ...
}

这实际上是在说 &((*self).v),因为 . 自动取消引用,您需要告诉编译器您实际上只是想借用向量。

for e in self.v.iter() {
// ...
}

这可能看起来很有趣,因为 iter 采用了 &self。为什么?好吧,如果您在接受引用的值上调用函数,编译器也会自动引用。这本质上是 (&((*self).v)).iter(),但这样写起来会很糟糕,所以编译器会帮忙。

那么为什么它不在 for 循环中自动引用呢?好吧,for x in self.v 是一个有效的语句,这可能就是您打算编写的内容。编译器通常更重要的是告诉您您想要什么是不可能的,而不是假设您想要其他东西。使用上面的自动(取消)引用,不存在这样的歧义。

首选前一种解决方案,但如果您想使用迭代器适配器,则后者是必需的。

说到这里,你的 sum 已经存在了:只需编写 self.v.iter().sum() 即可。

关于rust - 在结构中迭代 Vec - 无法移出借用的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38785744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com