我目前正在致力于实现一个生成大量对象并返回它们的迭代器。由于这段代码有很多检查,我想使用 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
的生命周期不能保证比迭代器长。
有没有办法让迭代器独立于这些引用?
您可以在任何地方注释生命周期要求:
impl TermGenerator {
pub fn generate<'a>(&'a self, text: &'a Term) -> MyIter<'a> {
struct MyIter<'a> {
iter: Box<dyn Iterator<Item = Term> + 'a>,
}