gpt4 book ai didi

rust - 迭代结构向量

转载 作者:行者123 更新时间:2023-11-29 07:57:52 25 4
gpt4 key购买 nike

我有一个结构体,其中包含另一种结构体类型的向量。

struct Element {
val: String,
}

struct Collection {
elements: Vec<Element>,
}

impl Collection {
fn process(&mut self) {
for entry in &self.elements.iter_mut() {
entry.val = "New value".to_string();
println!("{}", entry.val);
}
}
}

fn main() {
let e1 = Element {
val: "My first entry".to_string(),
};
let e2 = Element {
val: "My second entry".to_string(),
};
let mut c = Collection { elements: vec![] };
c.elements.push(e1);
c.elements.push(e2);
c.process();
}

当我尝试对其进行迭代时,出现以下错误:

error[E0277]: the trait bound `&std::slice::IterMut<'_, Element>: std::iter::Iterator` is not satisfied
--> src/main.rs:11:22
|
11 | for entry in &self.elements.iter_mut() {
| -^^^^^^^^^^^^^^^^^^^^^^^^
| |
| `&std::slice::IterMut<'_, Element>` is not an iterator; maybe try calling `.iter()` or a similar method
| help: consider removing 1 leading `&`-references
|
= help: the trait `std::iter::Iterator` is not implemented for `&std::slice::IterMut<'_, Element>`
= note: required by `std::iter::IntoIterator::into_iter`

我认为这是因为 &self.elements 确实是一个引用。使用 self.elements 会起作用,但我希望修改实际对象而不是副本。

这样做的正确方法是什么?

最佳答案

切换到这个:

for entry in self.elements.iter_mut() { /* ... */ }

或者更通俗地说:

for entry in &mut self.elements { /* ... */ }

IterMut 包含对向量中项目的引用(因此将直接更改向量项目),但它本身是堆栈上的一个对象,将被随着迭代的进行而改变。

the trait bound `&std::slice::IterMut<'_, Element>: std::iter::Iterator` is not satisfied

这表示您通过引用获得了一个 IterMut。也就是优先级和你想的不一样:

&self.elements.iter_mut() 
&(self.elements.iter_mut()) // Is this
(&self.elements).iter_mut() // Not this

但是,我们必须这样做:

(&mut self.elements).iter_mut()

因为 iter_mut 需要一个可变引用作为接收者。 Rust 理解这一点,让我们只做简单的版本并适本地传递可变性:

self.elements.iter_mut()

关于rust - 迭代结构向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28118159/

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