使用引用的生成器时如何处理生命周期?

问题描述 投票:0回答:1

我目前正在致力于实现一个生成大量对象并返回它们的迭代器。由于这段代码有很多检查,我想使用 genawaiter crate 中的生成器,这样就不必实现很多状态。然而,由于应该构造生成器的函数仅获取其输入的引用,因此我总是会遇到这些引用的生命周期问题。

我尝试注释子函数的生命周期,如下所示:

use genawaiter::{rc::gen, yield_};

pub struct TermGenerator {
    pub prefix: Term,
    pub suffix: Term,
}

impl TermGenerator {
    pub fn generate(&self, text: &Term) -> MyIter {
        let iter = self.get_prefix_terms(text).chain(self.get_suffix_terms(text));
        MyIter { iter: Box::new(iter)}
    }

    fn get_prefix_terms<'a>(&'a self, text: &'a Term) -> impl Iterator<Item = Term> + 'a {
        gen!({
            yield_!(Term::from(format!("{}-", self.prefix)));
            yield_!(Term::from(format!("{}-{}", self.prefix, text)));
        }).into_iter()
    }

    fn get_suffix_terms<'a>(&'a self, text: &'a Term) -> impl Iterator<Item = Term> + 'a {
        gen!({
            yield_!(Term::from(format!("{}-", self.suffix)));
            yield_!(Term::from(format!("{}-{}", self.suffix, text)));
        }).into_iter()
    }

    ...
}

struct MyIter {
    iter: Box<dyn Iterator<Item = Term>>,
    ...
}

(代码已简化,实际示例有更多检查)

但是现在我在

generate
函数中遇到了问题,因为
text
self
的生命周期不能保证比迭代器长。

有没有办法让迭代器独立于这些引用?

rust iterator generator lifetime
1个回答
0
投票

您可以在任何地方注释生命周期要求:

impl TermGenerator {
    pub fn generate<'a>(&'a self, text: &'a Term) -> MyIter<'a> {
struct MyIter<'a> {
    iter: Box<dyn Iterator<Item = Term> + 'a>,
}
© www.soinside.com 2019 - 2024. All rights reserved.