let numbers = vec![1, 2, 3, 4, 5, 6, 7, 8, 9];
let even_numbers: Vec<i32> = numbers.iter().filter(|&n| n % 2 == 0).map(|n| *n).collect();
let even_numbers: Vec<_> = numbers.iter().filter(|&n| n % 2 == 0).map(|n| n).collect();
I am a newbie with rust. When the type is explicit i have to dereference but if i don’t state the type "the compiler knows and automatically picks the value"? Am i missing something, should not it be the other way around? I can not wrap my head around it. Please a bit explanation.
>Solution :
.iter()
produces an iterator with an element type of &i32
.
To collect into a Vec<i32>
, you have to reference to copy the actual integer from the reference. That’s what .map(|n| *n)
does. (BTW .copied()
exists for this purpose).
The Vec<_>
tells the compiler "I just want a vector, but infer the element type" so it does just that and picks the element type from the iterator: &i32
.
You can instead use .into_iter()
on the original Vec
, which will consume the vector and return an iterator of owned (not references) elements (i32
) directly.