Full 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
有没有办法限制&#34;生命周期参数,或以某种方式重构它,以便返回相关类型(Item),并将其生命周期重新绑定到next()?
基本上,由于每个SplitSection都使用Split拥有的迭代器,我想确保两个SplitSections不会一次迭代。
谢谢!
答案 0 :(得分:3)
遗憾的是,当实现Iterator
特征时,Rust目前无法做到这一点 - 与方法的原始特征定义相比,不允许修改生命周期关系。
好消息是,最近合并的generic associated type RFC将在编译器中实现时提供语言功能。这可能需要一些时间。
我最近尝试过自己实现类似的功能,我在现有的稳定编译器中找到的最简单的方法是要求Clone + Iterator
,分别从&#34; host&#34;迭代分割块。迭代器(https://gitlab.com/mihails.strasuns/example-iterators-calendar/blob/master/src/split_adaptor.rs)