impl Trait 作为参数位置的使用

在前一节中,我们了解了如何使用 impl Trait 在不指定具体类型名称的情况下返回类型。同样的语法也可以用于参数位置

#![allow(unused)]
fn main() {
fn print_iter(iter: impl Iterator<Item = i32>) {
    for i in iter {
        println!("{}", i);
    }
}
}

print_iter 函数接收一个 i32 类型的迭代器并打印每个元素。当在参数位置使用 impl Trait 时,它等同于带有特质界限的泛型参数:

#![allow(unused)]
fn main() {
fn print_iter<T>(iter: T) 
where
    T: Iterator<Item = i32>
{
    for i in iter {
        println!("{}", i);
    }
}
}

不利之处

一般而言,相较于在参数位置使用 impl Trait,优先考虑使用泛型更为适宜。泛型允许调用者通过涡轮鱼语法(::<>)显式指定参数的类型,这对于消除类型歧义非常有用,而这是 impl Trait 所不具备的。