I'm trying Rust and have some issues with understanding "borrowing".
fn main() {
let mut x = 10;
let mut a = 6;
let mut y = &mut x;
*y = 6;
y = &mut a;
x = 15;
println!("{}", x);
}
And I've got an error:
error[E0506]: cannot assign to `x` because it is borrowed
--> <anon>:9:5
|
4 | let mut y = &mut x;
| - borrow of `x` occurs here
...
9 | x = 15;
| ^^^^^^ assignment to borrowed `x` occurs here
error[E0502]: cannot borrow `x` as immutable because it is also borrowed as mutable
--> <anon>:10:20
|
4 | let mut y = &mut x;
| - mutable borrow occurs here
...
10 | println!("{}", x);
| ^ immutable borrow occurs here
11 | }
| - mutable borrow ends here
How can I release x
from "y
-borrowing"?
This is currently a limitation of the Rust borrow checker, often referred to as "non lexical lifetimes" (NLL). The problem here is that the when you assign a reference to a variable (let mut y = &mut x;
) the reference has to be valid for the entire scope of the variable. This means that "x is borrowed" lasts for the entire scope of y
. So the compiler doesn't care about the line y = &mut a;
!
You can read a lot more (technical) discussion about this here at the tracking issue.
EDIT: non-lexical lifetimes have landed some time ago, so your code should compile fine now.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With