如何从Vector创建非消耗迭代器

Gil*_*les 6 rust

情况:

我有一种情况,我想Iterator在函数参数上调用特征上定义的一些方法.我想称之为的函数是获取一个被trait调用类型的参数VecLike.该函数被调用get_all_matching_rules.

get_all_matching_rules可以接收一个Vec或另一个类似的自制类型,也可以实现Iterator.当然这两个都实现了VecLike.我正在考虑添加一个函数VecLike让它返回一个Iterator以便我可以使用它get_all_matching_rules.

如果我的参数被命名:matching_rules我可以这样做matching_rules.iter().filter(.

题:

如何从一个非消耗迭代器返回Vec?

我希望能够在Vec<T>类型上返回非消耗迭代器Iterator<T>.我不打算通过调用来迭代这些项目.iter().

如果我有(自我是Vec):

fn iter<'a>(&'a self) -> Iterator<T> {
    self.iter()
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

error: mismatched types: expected `core::iter::Iterator<T>+'a`, found `core::slice::Items<'_,T>` (expected trait core::iter::Iterator, found struct core::slice::Items)
Run Code Online (Sandbox Code Playgroud)

我想回来Iterator<t>.如果有更好的方法去做这件事而不是回归Iterator,我会全力以赴.

Chr*_*gan 8

.iter()on[T],Vec<T>自动解引用,通过引用获取自身并生成类型实现Iterator<&T>.请注意,返回类型不是 Iterator<&T> ; Iterator是一个由具体类型实现的特征,具体类型Items<T>是那种情况下的返回类型,而不是Iterator<&T>.目前没有任何语法可以将返回类型仅仅指定为由它实现的特征,尽管impl Iterator<&T>已经建议了语法.

现在你希望实现一些Iterator<T>而不是Iterator<&T>.在Rust的内存模型中,每个对象只有一个东西,这对于相同的对象是不可能的 ; 必须有一些约束,让你从中得到一个新T的&T.有两个容易提供的解决方案:

  1. 的Copy特点,对于可以只复制按位类型.鉴于实现类型的变量Iterator<&T>,其中T被Copy,这可以写.map(|&x| x)或.map(|x| *x)(二者是等效的).

  2. Clone适用于任何可以使操作有意义的类型的特征,无论Copy边界如何.由于实施类型的变量Iterator<&T>,其中T是Clone,这可以写成.map(|x| x.clone()).

因此,给定一个向量v,v.iter().map(|x| x.clone()).通常,这样的事情:

fn iter<T: Clone>(slice: &[T]) -> Map<&T, T, Items<T>> {
    slice.iter().map(|x| x.clone())
}
Run Code Online (Sandbox Code Playgroud)