Impl trait in argument types

stable

When you use an impl Trait in the type of a function argument, that is generally equivalent to adding a generic parameter to the function. So this function:

#![allow(unused)] fn main() { fn sum_integers(integers: impl Iterator<Item = u32>) -> u32 { // ^^^^^^^^^^^^^ let mut sum = 0; for integer in integers { sum += x; } sum } }

is roughly equivalent to the following generic function:

#![allow(unused)] fn main() { fn sum_integers<I>(integers: I) -> u32 where I: Iterator<Item = u32> { let mut sum = 0; for integer in integers { sum += x; } sum } }

Intuitively, a function that has an argument of type impl Iterator is saying "you can give me any sort of iterator that you like".