Error code E0389
Note: this error code is no longer emitted by the compiler.
An attempt was made to mutate data using a non-mutable reference. This
commonly occurs when attempting to assign to a non-mutable reference of a
mutable reference (&(&mut T)
).
Erroneous code example:
struct FancyNum { num: u8, } fn main() { let mut fancy = FancyNum{ num: 5 }; let fancy_ref = &(&mut fancy); fancy_ref.num = 6; // error: cannot assign to data in a `&` reference println!("{}", fancy_ref.num); }
Here, &mut fancy
is mutable, but &(&mut fancy)
is not. Creating an
immutable reference to a value borrows it immutably. There can be multiple
references of type &(&mut T)
that point to the same value, so they must be
immutable to prevent multiple mutable references to the same value.
To fix this, either remove the outer reference:
struct FancyNum { num: u8, } fn main() { let mut fancy = FancyNum{ num: 5 }; let fancy_ref = &mut fancy; // `fancy_ref` is now &mut FancyNum, rather than &(&mut FancyNum) fancy_ref.num = 6; // No error! println!("{}", fancy_ref.num); }
Or make the outer reference mutable:
struct FancyNum { num: u8 } fn main() { let mut fancy = FancyNum{ num: 5 }; let fancy_ref = &mut (&mut fancy); // `fancy_ref` is now &mut(&mut FancyNum), rather than &(&mut FancyNum) fancy_ref.num = 6; // No error! println!("{}", fancy_ref.num); }