具有多个生命周期参数的迭代器的 impl Iterator 失败

3

我有一段代码,它看起来(有点)像这样:

struct OutputIterator<'r, 'i: 'r> {
    input_handler: &'r mut InputHandler<'i>
}

impl<'r, 'i> Iterator for OutputIterator<'r, 'i> {
    type Item = i32;

    fn next(&mut self) -> Option<Self::Item> {
        self.input_handler.inputs.next().map(|x| x * 2)
    }
}

struct InputHandler<'a> {
    inputs: Box<dyn Iterator<Item = i32> + 'a>
}

impl<'a> InputHandler<'a> {
    fn outputs<'b>(&'b mut self) -> OutputIterator<'b, 'a> {
        OutputIterator { input_handler: self }
    }
}

fn main() {
    let mut input_handler = InputHandler {
        inputs: Box::new(vec![1,2,3,4,5].into_iter())
    };
    for output in input_handler.outputs() {
        println!("{}", output);
    }
}

基本上,用户可以提供一个输入迭代器,然后获得一个输出迭代器(在我的实际代码中,输入和输出之间的连接更加复杂,涉及一堆内部状态。多个输入可能指向一个输出,反之亦然)。

这种方法是可行的,但我希望改为使用impl Iterator,以隐藏OutputIterator类型并允许更轻松地在测试中使用虚假对象替换返回类型。我尝试将InputHandler impl更改为以下代码:

impl<'a> InputHandler<'a> {
    fn outputs<'b>(&'b mut self) -> impl Iterator<Item = i32> + 'b {
        OutputIterator { input_handler: self }
    }
}

很不幸,这给了我以下错误:error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds

有没有办法让它起作用?对于接口来说,InputHandler需要带有某些生命周期的迭代器,显然必须将其传递给OutputIterator,但我真的很想将这些细节从调用者那里抽象出来。原则上,调用者只需确保输入的IteratorInputHandlerOutputIterator更长寿,因此我认为这里在OutputIterator上的逻辑生命周期约束是这两个的较小值?是否能够清楚地解释为什么会出现这个错误以及如何修复它,都将非常有帮助!

如果有帮助,这里是一个rust playground,其中包含代码。

1个回答

3

1
这个可以用。谢谢!当然有点丑,但是它能用!你觉得这是生命周期系统工作的必要特性,还是一个他们可能会修复的粗糙边缘? - Julian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接