Was ist die genaue Definition der for-Schleife in Rust?

Ich komme aus C (und in geringerem Maße aus C ++). Ich habe den folgenden Codeausschnitt geschrieben:

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

Dies wurde wie erwartet kompiliert und ausgeführt, aber dann habe ich den Typ des Arguments angegeben, das an den Closure übergeben wird.print_me also:

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

Ich habe einen Kompilierungsfehler:

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}`

Now das verwirrte mich, bis ich @ änderk zu&k in demfor Anweisung, die gut funktioniert hat:

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

Es scheint, dass ich das @ falsch verstanden hafor -Syntax selbst - oder vielleicht die genaue Funktionsweise eines Iterators - oder vielleicht die Verwendungssyntax einer Referenz gegenüber einem Zeiger [die verwandt, aber in C ++ unterschiedlich sind].

Im Konstruktfor A in B { C1; C2; ... Cn }, was genau sindA undB soll sein?