我有一个结构,其中包含另一个结构类型的向量.
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();
}
Run Code Online (Sandbox Code Playgroud)
当我尝试迭代它时,我收到以下错误:
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`
Run Code Online (Sandbox Code Playgroud)
我认为这是因为&self.elements它真的是一个参考.使用self.elements会工作,但我希望修改实际的对象而不是副本.
这样做的正确方法是什么?
切换到:
for entry in self.elements.iter_mut() { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
或更具惯用性:
for entry in &mut self.elements { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
IterMut包含对向量中项目的引用(因此将直接更改向量项),但它本身就是堆栈中的对象,随着迭代的进行将被更改.
Run Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)
但是,我们必须做这样的事情:
(&mut self.elements).iter_mut()
Run Code Online (Sandbox Code Playgroud)
因为iter_mut需要一个可变参考作为接收者.Rust理解这一点,让我们只做简单的版本并适当地传递可变性:
self.elements.iter_mut()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5076 次 |
| 最近记录: |