References

References let you pass a way to access a value to a function without copying the value. &identifier is a reference to the identifier value, &Person is a type that is a reference to the Person type. To go from a reference to the value dereference let bob = *bob_ref, but this happens automatically with 'autoderef'.

References are stack allocated pointers to values in the heap. They represent a borrowed value.

#![allow(unused)] fn main() { let a = 1; let referenceToA: &i32 = &a; let mutableReferenceToA = &mut a; }

Dereferencing

* is the inverse of &.

#![allow(unused)] fn main() { let a = 1; let a_ref = &a; let b = *a_ref; }

The 'dot' operator . dereferences automatically.

Mutable References

#![allow(unused)] fn main() { let mut identifier = 1; let mut_ref = &mut identifier; // this is a mutable reference. Mutable borrow. }

There can be only one mutable reference, and it cannot be in scope with an immutable reference.

More on passing to functions and mutability

  • fn function_name(variable: String) takes a String and owns it. If it doesn't return anything, then the variable dies inside the function.
  • fn function_name(variable: &String) borrows a String and can look at it
  • fn function_name(variable: &mut String) borrows a String and can change it