我想实现一个接受特征迭代器的函数。
trait A
{
fn f(&self);
}
fn foo<It>(it: It)
where
It: Iterator,
It::Item: A
{
it.for_each(|x| x.f());
}
如果我将对象移动到函数中,这将起作用:
let aa = vec![...]; // it has some objects that implement A
foo(aa.into_iter());
但是,如果我不想移出容器,那么它就不起作用,因为编译器会抱怨
&Something
没有实现 A
。
foo(aa.iter());
我可以接受一片。
fn foo(aa: &[impl A]) { ... }
但是只有当我传递一个简单的容器时它才会起作用,但如果我想要像这样更复杂的东西,它就不起作用:
foo(bars.iter().map(|bar| bar.a));
引入另一个泛型类型参数
T
,这样迭代器Item
是&T
和T
实现A
的约束就可以分开列出:
fn foo<'a, T: 'a, It>(it: It)
where
It: Iterator<Item = &'a T>,
T: A,
{
it.for_each(|x| x.f());
}