在向量中调用结构的特征方法时出现问题
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
我想做什么
本例中的方法是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