如何解决实现迭代器特征时如何修复生命周期不匹配?
我目前正在通过练习学习 Rust 语言。我的新挑战是使用存储工具
Iterator Trait
到我的数据结构哪个角色是在 Vec<String>
上使用内部迭代器:
impl<'a> CSVReader<'a> {
pub fn new(lines: Vec<String>,nb_labels: u32,labels: Vec<String>,delim: char) -> Self {
CSVReader {
lines,iter: None,delim,nb_labels,labels
}
}
fn update_iter(&'a mut self) {
match &self.iter {
Some(_) => (),None => { self.iter = Some(self.lines.iter()) }
};
}
// ...
}
impl<'a> Iterator for CSVReader<'a> {
type Item = Vec<String>;
fn next(&mut self) -> Option<Self::Item> {
self.update_iter(); // ------- line 66
let line: String;
if let Some(iter) = &mut self.iter {
line = iter.next()?.clone();
let cols: Vec<String> = line
.split(self.delim)
.map(|x| x.to_string())
.collect();
Some(cols)
} else {
None
}
}
}
error[E0495]: cannot infer an appropriate lifetime for autoref due to conflicting requirements
--> src/csv_parser/reader.rs:66:14
|
66 | self.update_iter();
我尝试为 Iterator Trait
的实现添加生命周期精度,但我收到另一个错误,要求我使用正确的 next()
函数原型。
我希望你能帮助我理解为什么它不起作用并提供一些解决方案来解决它:)
解决方法
您正在尝试创建一个自引用结构——其中一个字段引用另一个。做到这一点很难,但并非不可能。刚开始时最好避免自引用结构体,无论哪种方式都应该谨慎使用它们。
我可以看到以下解决方案:
- 使用拥有底层向量的迭代器,通过
vec.into_iter()
- 存储索引而不是指针
- 请注意,当代码受内存限制时,这几乎不会影响性能。
- 使用 rental crate 创建一个自引用结构。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。