Каково точное определение цикла for в Rust?

Я пришел из C (и в меньшей степени, C ++) фона. Я написал следующий фрагмент кода:

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

Это скомпилировано и работает, как и ожидалось, но затем я указал тип аргумента, передаваемого закрытиюprint_me таким образом:

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

Я получил ошибку компиляции:

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

Теперь это смущало меня, пока я не изменилсяk в&k вfor Заявление, которое работало нормально:

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

Кажется, я неправильно понялfor сам синтаксис - или, возможно, точная работа итератора - или, возможно, синтаксис использования ссылки по отношению к указателю [которые связаны, но различны в C ++].

В конструкцииfor A in B { C1; C2; ... Cn }что именноA а такжеB должно быть?