![](/img/trans.png)
[英]How do I fix the lifetime mismatch when returning a mutable reference to the struct's field from a trait method?
[英]How to fix lifetime mismatch when implementing Iterator Trait?
我目前正在通过练习学习 Rust 语言。 我的新挑战是对我的数据结构使用 store 实现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()
function 的正确原型。
我希望您能帮助我理解为什么它不起作用并提供一些解决方案来解决它:)
您正在尝试创建一个自引用结构——其中一个字段引用另一个。 做到这一点很难,但并非不可能。 开始时最好避免使用自引用结构,并且无论哪种方式都应该谨慎使用它们。
我可以看到以下解决方案:
vec.into_iter()
使用拥有基础向量的迭代器
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.