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
所不具备的。