I'm coming from a C (and to a lesser extent, C++) background. I wrote the following code snippet:
fn main() { let my_array = [1, 2, 3]; let print_me = |j| println!("= {}", j); for k in my_array.iter() { print_me(k); } } This compiled and ran as expected, but then I specified the type of the argument passed to the closure print_me thus:
fn main() { let my_array = [1, 2, 3]; let print_me = |j: i32| println!("= {}", j); for k in my_array.iter() { print_me(k); } } I got a compilation error:
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 this confused me until I changed k to &k in the for statement, which worked fine:
fn main() { let my_array = [1, 2, 3]; let print_me = |j: i32| println!("= {}", j); for &k in my_array.iter() { print_me(k); } } It seems that I misunderstood the for syntax itself -- or maybe the exact workings of an iterator -- or maybe the usage syntax of a reference vis-a-vis a pointer [which are related but distinct in C++].
In the construct for A in B { C1; C2; ... Cn }, what exactly are A and B supposed to be?