# Scope and Shadowing

Variable bindings have a scope, and are constrained to live in a block. A block is a collection of statements enclosed by braces `{}`.

    fn main() {
        // This binding lives in the main function
        let long_lived_binding = 1;

        // This is a block, and has a smaller scope than the main function
        {
            // This binding only exists in this block
            let short_lived_binding = 2;

            println!("inner short: {}", short_lived_binding);
        }
        // End of the block

        // Error! `short_lived_binding` doesn't exist in this scope
        println!("outer short: {}", short_lived_binding);
        // FIXME ^ Comment out this line

        println!("outer long: {}", long_lived_binding);
    }

Also, variable shadowing is allowed.

    fn main() {
        let shadowed_binding = 1;

        {
            println!("before being shadowed: {}", shadowed_binding);

            // This binding *shadows* the outer one
            let shadowed_binding = "abc";

            println!("shadowed in inner block: {}", shadowed_binding);
        }
        println!("outside inner block: {}", shadowed_binding);

        // This binding *shadows* the previous binding
        let shadowed_binding = 2;
        println!("shadowed in outer block: {}", shadowed_binding);
    }