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

2024-05-15

情况:

我有一种情况,我想调用定义在Iterator函数参数的特征。我想调用它的函数接受一个类型的参数,该类型是trait called VecLike。该函数称为get_all_matching_rules.

get_all_matching_rules可以接收一个Vec或其他类似的自制的类型也实现Iterator。当然这两个都实现了VecLike。我正在考虑添加一个功能VecLike让它返回一个Iterator这样我就可以用它get_all_matching_rules.

如果我的参数被命名为:matching_rules然后我可以做matching_rules.iter().filter(.

问题:

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

我希望能够返回一个非消耗迭代器Vec<T>类型的Iterator<T>。我不想通过调用来迭代这些项目.iter().

如果我有(其中 self 是 Vec):

fn iter<'a>(&'a self) -> Iterator<T> {
    self.iter()
}

我收到以下错误:

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

我想退回Iterator<t>。如果有更好的方法来解决这个问题而不是返回一个Iterator,我洗耳恭听。


.iter() on [T] http://doc.rust-lang.org/std/slice/primitive.slice.html#method.iter, which Vec<T>自动取消引用,通过引用获取 self 并生成一个实现的类型Iterator<&T>。请注意,返回类型是not Iterator<&T>; Iterator is a trait它是由具体类型实现的,具体类型Items<T>是这种情况下的返回类型,而不是Iterator<&T>。当前没有任何语法可以仅将返回类型指定为由其实现的特征,尽管语法impl Iterator<&T>已建议。

现在你希望实现一些东西Iterator<T>而不是Iterator<&T>。在 Rust 的内存模型下,每个对象都由一个事物拥有,这是不可能的与相同的物体;必须有一些限制才能让您获得新的T来自&T。为此,有两种现成的解决方案:

  1. The Copy http://doc.rust-lang.org/std/kinds/trait.Copy.html特征,用于只能按位复制的类型。给定一个类型实现的变量Iterator<&T> where T is Copy,这可以写成.map(|&x| x) or .map(|x| *x)(两者是等价的)。

  2. The Clone http://doc.rust-lang.org/std/clone/trait.Clone.html特征,对于可以使操作有意义的任何类型,无论Copy界限。给定一个类型实现的变量Iterator<&T> where T is 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())
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 Vector 创建非消耗迭代器 的相关文章

随机推荐