In Rust, every data value has a single owning scope—no more, no less. So, what's a scope? The easy answer is that a scope is the place where a block expression stores its variables. Scopes are not directly represented in the source code, but a scope begins when a block expression begins, with a { symbol, and ends when the block expression ends, with } (or when a return statement is run before the block reaches its end). The scope is the chunk of memory where the block's variables are stored.
Every data value has an owning scope, including implied temporary values such as the result of 2 + 2 when we ask Rust to compute (2 + 2) * 3.
When Rust is done with a scope, all of the data values that scope owns are discarded and the memory that was used to store them is freed up for other uses. This includes memory that was allocated on the heap, which...