Borrows can not last longer than the data value that they're borrowing. The Rust compiler has to make sure that no part of the program could allow that to happen, which means that it has to keep track of the lifetime of every borrow. In the examples we've seen so far, that's easy, because each borrow was created when we called a function and ended when the function returned, while the values that were borrowed lived until the end of the block expression that contained the function calls.
The lifetimes of the borrows were obviously shorter than the lifetimes of the variables, beginning later and ending sooner.
However, it's not hard to create situations where the compiler needs us to give it a hint about how long a borrow can exist, or how long the borrowed value will remain valid. We've already seen that once, when we used...