Qual é a definição exata do loop for no Rust?

Estou vindo de um plano de fundo em C (e, em menor grau, em C ++). Eu escrevi o seguinte trecho de código:

fn main() {
    let my_array = [1, 2, 3];
    let print_me = |j| println!("= {}", j);
    for k in my_array.iter() {
        print_me(k);
    }
}

Isso foi compilado e executado conforme o esperado, mas especifiquei o tipo de argumento passado para o fechamentoprint_me portanto:

fn main() {
    let my_array = [1, 2, 3];
    let print_me = |j: i32| println!("= {}", j);
    for k in my_array.iter() {
        print_me(k);
    }
}

Eu recebi um erro de compilação:

error[E0308]: mismatched types
 --> src/main.rs:6:22
  |
6 |             print_me(k);
  |                      ^
  |                      |
  |                      expected i32, found &{integer}
  |                      help: consider dereferencing the borrow: `*k`
  |
  = note: expected type `i32`
             found type `&{integer}`

Agora isso me confundiu até que eu mudeik para&k nofor declaração, que funcionou bem:

fn main() {
    let my_array = [1, 2, 3];
    let print_me = |j: i32| println!("= {}", j);
    for &k in my_array.iter() {
        print_me(k);
    }
}

Parece que eu não entendi ofor própria sintaxe - ou talvez o funcionamento exato de um iterador - ou talvez a sintaxe de uso de uma referência em relação a um ponteiro [que são relacionados mas distintos em C ++].

Na construçãofor A in B { C1; C2; ... Cn }, o que exatamente sãoA eB deveria ser?