我想做什么
本例中的方法是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/