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

标签 rust traits

我想做什么

本例中的方法是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/

相关文章:

rust - 为什么使用rust 使用rsi将参数传递给fn指针

rust - 借用检查器如何处理从函数返回的引用?

rust - 无法将特征方法纳入范围

oop - 如何动态生成用于特征的值?

generics - 只能使用泛型来实现无类型 lambda 演算吗?

rust - 是否可以使用 Rust 生成 jsx AST?

rust - 在 S<T> 上使用通用特征强制我让 T 比 S 长寿

scala - 如何在 scalaz 中导入身份操作?

Scala 匿名类型约束

rust - 如何选择或加入不同类型的 future ?