在 Rust 中,如何编写一个接受特征引用迭代器的通用函数?

问题描述 投票:0回答:1

我想实现一个接受特征迭代器的函数。

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));
rust iterator
1个回答
0
投票

引入另一个泛型类型参数

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());
}
© www.soinside.com 2019 - 2024. All rights reserved.