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

Problem calling a trait method of a struct in a vector

我想做什么

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

我试过但为什么没用

我看过 E0507 和其他关于类似问题的文章。那些看起来可能帮助提到我需要在flowers上实现Copy,所以Flower的向量,所以Flower也需要实现Copy但是可以不是因为 the trait 'Copy' may not be implemented for this type.

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

我最好的猜测是什么

它与自我有关,它的可变性以及我如何查看 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();
}

为了更好 post,您应该包含收到的错误消息。

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

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

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

或者

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

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

看这里:rust playground