如何在Rust中为引用创建一个“可迭代”特征?

Tunococ

我试图创建一个特点,抓住了iter在功能slice以及VecDequeBTreeMapHashMap我希望此特征的实现者能够指定和实现自己的迭代器类型,但是看起来此迭代器类型必须具有生命周期参数,并且不能将其作为关联类型给出。

更详细地讲,这是我希望在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Rust中定义一个包含可迭代项的结构上的迭代器?

如何在Rust中定义一个递归特征?

如何在 Scala 中创建一个总和为最大值的半同质整数的可迭代对象?

如何在一个 ColumnTransformerr 中为所有类型的特征、分类特征和数值特征组合管道?

如何在Rust中定义一个符合特征的变量?

如何创建迭代器重复 Rust 中的最后一个元素

如何创建一个迭代器,该迭代器生成由Rust中的索引列表指定的集合元素?

如何在Rust中返回一个引用self的结构?

一个以特征为参数的Rust闭包

如何在每次循环迭代中创建一个新的 JSON 对象

如何在python中的类中的任何函数中创建一个可访问的变量?

如何在 Rust / gtk-rs 中创建一个简单的 Gtk MessageDialog?

如何在 Rust 中创建一个将(通用)IntoIterator 项目分组的通用函数?

如何在python中创建一个迭代器类,它将以相反的顺序迭代输入?

如何在 Rust 中获取两个结构以使用并共享对另一个结构的引用

我应该如何在xtext中创建一个or引用?

SQLite如何在一个表中设置加入自引用以创建多列

如何在可扩展的反应表中创建一个包含一个单元格的行?

如何在Lua中创建一个简单的可导入类?

如何在angularjs UI-Bootstrap中创建一个可关闭的选项卡

如何在Swift中创建一个返回可解码类型的函数?

我们如何在Keras中创建一个块(可重用的函数集)?

如何在导航抽屉中创建一个可扩展的listView?

如何在reactjs的另一个应用程序中创建可重用组件?

为一个Javascript功能创建特征检测(intersectionObserver)

如何在 Sonata Admin 中为一个实体创建 2 个管理员?

如何在MATLAB中为4个子图创建一个通用图例?

如何在 JSP 中迭代一个 ArrayList

如何创建一个带有迭代器的 Rust 结构?