我试图创建一个特点,抓住了iter
在功能slice
以及VecDeque
,BTreeMap
和HashMap
。我希望此特征的实现者能够指定和实现自己的迭代器类型,但是看起来此迭代器类型必须具有生命周期参数,并且不能将其作为关联类型给出。
更详细地讲,这是我希望在Rust中实现的功能:
trait RefIterable<T>
where for<'a> (T: 'a) => (Self::Iter<'a>: Iterator<Item = &'a T>)
{
type Iter; // Has kind (lifetime -> type)
fn refs<'a>(&'a self) -> Self::Iter<'a>
}
如果可能的话,实现可能如下所示
impl RefIterable<T> for Vec<T> {
type Iter<'a> = std::slice::Iter<'a, T>; // This is not valid Rust code.
fn refs<'a>(&'a self) -> std::slice::Iter<'a, T> {
self.as_slice().iter()
}
}
我对Rust还是比较陌生,所以我想问是否已经有一种我不知道的方法,或者是否有解决此问题的好方法。我以为这种情况不是很罕见。
(使用这Box<dyn 'a + Iterator<Item = &'a T>>
是我当前的解决方法,但这阻止了某些优化的进行。)
编辑:
EvilTak的答案可能是我们现在可以做的最好的事情。到T: 'a
今天为止,Rust仍不支持将所有可能的寿命与条件组合为一个未参数化的特征的能力。
相反,将lifetime参数添加到trait,这使您可以在关联的类型Iter
的绑定中使用它:
trait RefIterable<'a> {
type Item: 'a;
type Iter: Iterator<Item = &'a Self::Item>; // Has kind (lifetime -> type)
fn refs(&'a self) -> Self::Iter;
}
Item: 'a
要使编译器知道引用(&'a Self::Item
)不超过类型(Self::Item
),就必须使用该界限。
我已进行修改RefIterable
,使其遵循Iterator
使用关联类型的约定来指定要迭代的项的类型,其原因与Iterator
使用关联类型背后的原因相同。
实现非常简单:
impl<'a, T: 'a> RefIterable<'a> for Vec<T> {
type Item = T;
type Iter = std::slice::Iter<'a, T>;
fn refs(&'a self) -> std::slice::Iter<'a, T> {
self.as_slice().iter()
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句