Rust中如何在返回结构体中捕获迭代器?所有权问题求助
解决Rust中返回包裹迭代器的结构体的借用问题
你的核心问题在于错误地存储了迭代器的引用,而不是迭代器本身。self.data.iter_mut()创建的是一个临时的IterMut实例,它在函数结束时就会被销毁,此时返回它的引用会造成悬空引用,这是Rust严格禁止的。
修正方案:直接存储迭代器实例
IterMut<'a, String>本身就持有对Data的可变借用,它的生命周期'a会和原数据的借用周期绑定。所以只需要调整DataIterator的定义,直接存储迭代器而不是它的引用:
struct Data { data: [String; 10] } struct DataIterator<'a> { // 直接存储IterMut实例,而非引用 value: std::slice::IterMut<'a, String> } impl Data { // 使用'_生命周期省略语法,等同于<'a> fn get_string(&mut self) -> DataIterator<'_> { DataIterator { value: self.data.iter_mut() } } }
这样修改后,DataIterator会持有对Data的可变借用,当DataIterator被drop时,对应的借用也会结束,完全符合你的需求。
多字段迭代器的扩展场景
如果需要返回多个迭代器借用Data的不同字段,只要保证每个迭代器借用的是独立的字段(避免同时存在同一数据的多个可变借用),就可以用同样的方式实现:
struct Data { strings: [String; 10], numbers: [i32; 10] } struct StringIter<'a> { iter: std::slice::IterMut<'a, String>, } struct NumberIter<'a> { iter: std::slice::IterMut<'a, i32>, } impl Data { fn get_string_iter(&mut self) -> StringIter<'_> { StringIter { iter: self.strings.iter_mut(), } } fn get_number_iter(&mut self) -> NumberIter<'_> { NumberIter { iter: self.numbers.iter_mut(), } } }
因为两个迭代器分别借用Data的不同字段,Rust允许同时存在这两个可变借用,不会触发借用检查错误。
内容的提问来源于stack exchange,提问作者LucioleMaléfique
相关产品推荐
相关产品推荐

