The compiler enforces valid borrowing using its borrow checker. To accomplish this, it keeps track of two things:
The lifetime of an object starts when the object is created and ends when it goes out of scope (i.e. it gets destroyed, because of the RAII discipline).
A lifetime looks like this: 'burrito, which reads as: "lifetime burrito".
All references actually have a type signature of the form &'a T, where
'a is the lifetime of the referenced object. The compiler takes care of
inserting the lifetime part 'a so we can simply type annotate references with
&T.
For example:
let integer: int = 5;
let ref_to_int: &int = &integer;
integer has lifetime 'i (it could be any other name, like 'foo)ref_to_int has lifetime 'r (references also have lifetimes!)ref_to_int type signature actually is &'i int (the compiler inserts the
'i for us)&'i int reads as:&: reference to anint: integer with'i: lifetime i (i is the lifetime of integer!)Because the compiler keeps track of the lifetime of referenced objects in the type system, it can avoid several memory bugs.
Haven't grokked what a lifetime is yet? Don't dismay! See the next page.