References are immutable by default
fn main() {
let a = 10;
let b = &a;
b = 2; // Compiler Error
println!("b={}",b);
}
$ cargo run
10
References are made MUTABLE explicitly
fn main() {
let mut a = 'A';
let b:&mut char = &mut a;
*b = 'B';
println!("{}", *b);
}
$ cargo run
B
|
We can have any number of immutable borrows (&T) at a time OR
We can have exactly 1 mutable borrow (&mut T) at a time.
We cannot mix them.
Using Aliasing XOR Mutability rule
fn main() {
let mut numbers = vec![1, 2, 3];
let first = &numbers[0]; // IMMUTABLE borrow (&). Ok
// MUTABLY borrow (&mut) numbers to push an item
numbers.push(4); // ❌ COMPILE ERROR: cannot borrow `numbers` as mutable
// because it is also borrowed as immutable (`first`)
}
|