Closed
Description
code:
#[derive(Debug)]
struct A {
a: i32,
}
impl A {
fn double(&mut self) {
self.a += self.a
}
}
fn main() {
let mut v = [A { a: 4 }];
v.iter().for_each(|a| a.double());
println!("{:?}", v);
}
The code gives the following not-very-helpful warning:
error[E0596]: cannot borrow `*a` as mutable, as it is behind a `&` reference
--> src/main.rs:14:27
|
14 | v.iter().for_each(|a| a.double());
| - ^ `a` is a `&` reference, so the data it refers to cannot be borrowed as mutable
| |
| help: consider changing this to be a mutable reference: `&mut A`
warning: variable does not need to be mutable
--> src/main.rs:13:9
|
13 | let mut v = [A { a: 4 }];
| ----^
| |
| help: remove this `mut`
|
= note: #[warn(unused_mut)] on by default
error: aborting due to previous error
trying to use
v.iter().for_each(|&mut a| a.double());
and a none-mutable vector just causes more errors
error[E0308]: mismatched types
--> src/main.rs:14:24
|
14 | v.iter().for_each(|&mut a| a.double());
| ^^^^^^ types differ in mutability
|
= note: expected type `&A`
found type `&mut _`
= help: did you mean `mut a: &&A`?
The actual fix is to use iter_mut()
instead of just iter()
:
#[derive(Debug)]
struct A {
a: i32,
}
impl A {
fn double(&mut self) {
self.a += self.a
}
}
fn main() {
let mut v = [A { a: 4 }];
v.iter_mut().for_each(|a| a.double());
println!("{:?}", v);
}
It would be very helpful the compiler could suggest iter_mut()
!