I wrote a Rust program that generates all the two-letter permutations of lower-case English letters ("aa", "ab", ..., "zy", "zz"):
fn main() {
    static ASCII_LOWER: [char; 26] = [
        'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
        'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
    ];
    let x: Vec<_> = ASCII_LOWER.iter().flat_map(|a| {
        let result = ASCII_LOWER.iter().map(move |b| {
            format!("{}{}", a, b)
        });
        dbg!(a);  // <--- How can `a` still be used?
        result
    }).collect();
    dbg!(x);
}
I need to mark the inner closure as move, because otherwise the captured borrow of a doesn't live long enough. However, I don't understand what this move actually does in this case. I can still use a after the closure. What does the move actually do here?
 
    