rust - 关联类型的 self 生命周期

标签 rust

完整的 Rust 示例在这里: https://play.rust-lang.org/?gist=0778e8d120dd5e5aa7019bc097be392b&version=stable

总体思路是实现一个通用的拆分迭代器,该迭代器将为由指定分隔符拆分的每次运行的值生成迭代器。所以对于 [1, 2, 3, 0, 4, 5, 6, 0, 7, 8, 9],split(0) 你会得到 [[1, 2, 3 ], [4, 5, 6], [7, 8, 9]]

对于这段代码:

impl<'a, I, F> Iterator for Split<I, F>
    where I: Iterator,
          F: PartialEq<I::Item>,
{
    type Item = SplitSection<'a, I, F>;
    fn next(&'a mut self) -> Option<Self::Item> {
        self.iter.peek().map(|_| 
        SplitSection {
            exhausted: false,
            iter: self,
        })
    }
}

我收到以下错误:

error[E0207]: the lifetime parameter `'a` is not constrained by the impl trait, self type, or predicates
  --> src/main.rs:22:6
   |
22 | impl<'a, I, F> Iterator for Split<I, F>
   |      ^^ unconstrained lifetime parameter

有没有一种方法可以“约束”生命周期参数,或者以某种方式重构它,以便返回关联类型(Item)的生命周期,并将其与 next() 联系起来?

基本上,由于每个 SplitSection 都使用 Split 拥有的迭代器,我想确保不会同时迭代两个 SplitSection。

谢谢!

最佳答案

遗憾的是,目前在 Rust 中实现 Iterator 特征时这是不可能的 - 与方法的原始特征定义相比,不允许修改生命周期关系。

好消息是最近合并了generic associated type RFC在编译器中实现时,将提供一种语言功能来执行此操作。不过,这可能需要一些时间。

我最近尝试自己实现类似的功能,我发现现有的稳定编译器最简单的方法是需要Clone + Iterator,从“主机”迭代器(https://gitlab.com/mihails.strasuns/example-iterators-calendar/blob/master/src/split_adaptor.rs)中单独迭代拆分块。 )

关于rust - 关联类型的 self 生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46128041/

相关文章:

file - Rust-开放的动态作者人数

c - 如何为可以提供分配器的 C 库使用 Rust 内存分配器?

generics - 在通用结构实现中将文字转换为关联类型

rust - 在 Rust 中将 Vec<&str> 转换为 Vec<&CStr>

rust - 无法将Struct属性设置为Enum Rust

rust - 当给定的枚举不是某个变体时,如何返回 None ?

rust - 为什么可以在对 File 的不可变引用上实现 Read?

rust - 无法从同一文件夹导入模块(结构)

x/y 坐标的排序向量

rust - 为什么不引用其中一个字符串就无法在 Rust 中连接两个字符串?