Advent of Rust Day 1 - Everything has a scope

This is a series where I’ll be discussing interesting Rust tidbits that I encounter when solving Advent of Code 2017.

You can find the complete (spoiler) solution here: udoprog/rust-advent-of-code-2017

I decided the use the following compact expression to open and read the entire contents of a file:

let mut data = String::new();
File::open(path)?.read_to_string(&mut data)?;

Desugared, it would read as something like this:

let mut data = String::new();

{
    let mut _f = File::open(path)?;
    _f.read_to_string(&mut data)?;
}

This means that the file is closed immediately after its contents has been read, and is not accessible anywhere else in the scope.