| An attempt was made to assign to a borrowed value. | |
| Erroneous code example: | |
| ```compile_fail,E0506 | |
| struct FancyNum { | |
| num: u8, | |
| } | |
| let mut fancy_num = FancyNum { num: 5 }; | |
| let fancy_ref = &fancy_num; | |
| fancy_num = FancyNum { num: 6 }; | |
| // error: cannot assign to `fancy_num` because it is borrowed | |
| println!("Num: {}, Ref: {}", fancy_num.num, fancy_ref.num); | |
| ``` | |
| Because `fancy_ref` still holds a reference to `fancy_num`, `fancy_num` can't | |
| be assigned to a new value as it would invalidate the reference. | |
| Alternatively, we can move out of `fancy_num` into a second `fancy_num`: | |
| ``` | |
| struct FancyNum { | |
| num: u8, | |
| } | |
| let mut fancy_num = FancyNum { num: 5 }; | |
| let moved_num = fancy_num; | |
| fancy_num = FancyNum { num: 6 }; | |
| println!("Num: {}, Moved num: {}", fancy_num.num, moved_num.num); | |
| ``` | |
| If the value has to be borrowed, try limiting the lifetime of the borrow using | |
| a scoped block: | |
| ``` | |
| struct FancyNum { | |
| num: u8, | |
| } | |
| let mut fancy_num = FancyNum { num: 5 }; | |
| { | |
| let fancy_ref = &fancy_num; | |
| println!("Ref: {}", fancy_ref.num); | |
| } | |
| // Works because `fancy_ref` is no longer in scope | |
| fancy_num = FancyNum { num: 6 }; | |
| println!("Num: {}", fancy_num.num); | |
| ``` | |
| Or by moving the reference into a function: | |
| ``` | |
| struct FancyNum { | |
| num: u8, | |
| } | |
| fn print_fancy_ref(fancy_ref: &FancyNum){ | |
| println!("Ref: {}", fancy_ref.num); | |
| } | |
| let mut fancy_num = FancyNum { num: 5 }; | |
| print_fancy_ref(&fancy_num); | |
| // Works because function borrow has ended | |
| fancy_num = FancyNum { num: 6 }; | |
| println!("Num: {}", fancy_num.num); | |
| ``` |