Rust返回正反迭代器时出现生命周期编译错误该如何解决?
错误原因
- Rust 中未显式标注生命周期的
dyn Trait特征对象默认带有'static生命周期约束,你返回的Box<dyn Iterator<Item=T>>会被编译器默认解析为Box<dyn Iterator<Item=T> + 'static>,要求被包装的迭代器必须满足'static生命周期,这就是报错的来源,和Iteratortrait、Rev结构体本身的定义无关。
正确实现
不需要引入'static约束,只要显式给函数添加生命周期参数,将输入迭代器和返回的特征对象的生命周期绑定即可,修改后的代码如下:
pub fn eggs<'a, I, T>(iter: I) -> Box<dyn Iterator<Item = T> + 'a> where I: Iterator<Item = T> + DoubleEndedIterator + 'a, { Box::new(iter.rev()) } pub fn bacon<'a, I, T>(iter: I, reverse: bool) -> Box<dyn Iterator<Item = T> + 'a> where I: Iterator<Item = T> + DoubleEndedIterator + 'a, { if reverse { Box::new(iter.rev()) } else { Box::new(iter) } } fn main() { let pants:String = "pants".into(); eggs(pants.chars()); }
修改说明
- 给函数声明了泛型生命周期参数
'a - 对输入迭代器泛型
I添加'a约束,表示传入的迭代器的生命周期至少和'a一致 - 返回值的特征对象增加
+ 'a约束,明确表示返回的迭代器Box的生命周期和传入的迭代器生命周期绑定,无需满足'static要求
内容的提问来源于stack exchange,提问作者Mutant Bob
相关产品推荐
相关产品推荐

