情况:
我有一种情况,我想调用定义在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
。为此,有两种现成的解决方案:
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)
(两者是等价的)。
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(使用前将#替换为@)