gpt4 book ai didi

rust - 在向量中调用结构的特征方法时出现问题

转载 作者:行者123 更新时间:2023-12-04 03:22:12 25 4
gpt4 key购买 nike

我想做什么

本例中的方法是Flower::update。在这种情况下,我需要循环调用 Flower 的更新。循环在 Garden::update_all() 中,这个循环定义了 flower 然后尝试调用 flower 上的更新但不起作用.

我试过但为什么没用

我看过 E0507 和其他关于类似问题的文章。那些看起来可能有助于提到我需要在 flowers 上实现 Copy,所以 Flower 的矢量,所以 Flower 也需要实现 Copy 但不能实现,因为可能无法为此类型实现特征“Copy”

另外,问题是我不想复制数据,我想在引用上调用一个方法。像 flower[0].update; 或类似的东西。我不需要使用数据,只调用一个改变它的方法。

我最好的猜测是什么

它与 self 和它的可变性以及我如何查看 flowers 并将单个 Flower 分配给变量 flower 和尝试在创建的可变引用上调用方法。但我不确定。该方法应该有 &mut self 还是 &self?循环应该生成一个新的mut flower,还是一个普通的flower,循环应该是&self.flowers还是self.flowers 。我尝试了很多变体,我认为它可能是这些变体的某种组合,还有一个我不知道的额外东西。

pub trait FlowerTrait {
fn update(&mut self);
}

pub struct Flower {
pub number: i32,
}

impl FlowerTrait for Flower {
fn update(&mut self) {
self.number += 1;
}
}

pub trait GardenTrait {
fn update_all(&mut self);
}

pub struct Garden {
pub flowers: Vec<Flower>,
}

impl GardenTrait for Garden {
fn update_all(&mut self) {
for mut flower in self.flowers {
flower.update();
}
}
}

fn main() {
let mut garden: Garden = Garden {
flowers: Vec::<Flower>::new(),
};

garden.update_all();
}

最佳答案

为了获得更好的帖子,您应该包含收到的错误消息。

问题的发生是因为幕后的 for 循环使用了 IntoIterator 特性中的 into_iterator 方法,并且转换消耗,即,发生移动

解决方案是迭代引用。只需将您的 for 循环更改为

for flower in &mut self.flowers {
// ...
}

或者另一种方式

for flower in self.flowers.iter_mut() { 
// ...
}

这会在引用(借用)上创建一个迭代器。

参见此处:rust playground

关于rust - 在向量中调用结构的特征方法时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68308535/

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