Shared and Unique Borrows
Rust puts constraints on the ways you can borrow values:
- You can have one or more
&Tvalues at any given time, or - You can have exactly one
&mut Tvalue.
fn main() { let mut a: i32 = 10; let b: &i32 = &a; { let c: &mut i32 = &mut a; *c = 20; } println!("a: {a}"); println!("b: {b}"); }
- The above code does not compile because
ais borrowed as mutable (throughc) and as immutable (throughb) at the same time. - Move the
println!statement forbbefore the scope that introducescto make the code compile. - After that change, the compiler realizes that
bis only ever used before the new mutable borrow ofathroughc. This is a feature of the borrow checker called “non-lexical lifetimes”.