为VecData<T>实现IntoIter与Iterator trait(避免克隆内部Vec<T>)
实现方案及代码
首先定义题目中的VecData结构体:
use std::cell::RefCell; use std::rc::Rc; pub struct VecData<T>(Rc<RefCell<Rc<Vec<T>>>>);
1. 定义迭代器结构体IntoIter
该结构体持有指向目标Vec的Rc(保证Vec生命周期),以及当前遍历的索引:
pub struct IntoIter<T> { vec_rc: Rc<Vec<T>>, index: usize, }
2. 为VecData实现IntoIterator trait
通过克隆内部的Rc<Vec<T>>(仅增加引用计数,不复制底层Vec)生成迭代器:
impl<T> IntoIterator for VecData<T> { type Item = &T; type IntoIter = IntoIter<T>; fn into_iter(self) -> Self::IntoIter { // 借用RefCell获取内部Rc并克隆(仅复制指针,无Vec克隆操作) let vec_rc = self.0.borrow().clone(); IntoIter { vec_rc, index: 0 } } }
3. 为IntoIter实现Iterator trait
通过索引遍历Rc指向的Vec,返回元素的引用:
impl<T> Iterator for IntoIter<T> { type Item = &T; fn next(&mut self) -> Option<Self::Item> { let item = self.vec_rc.get(self.index); if item.is_some() { self.index += 1; } item } }
关键说明
- 无Vec克隆:仅克隆轻量的
Rc指针,底层Vec<T>完全复用,符合要求。 - 生命周期安全:迭代器持有
Rc,确保遍历期间Vec不会被销毁;即使VecData内部的Vec被RefCell修改,迭代器仍会遍历调用into_iter时的旧Vec,行为可预测。 - 简洁性:用索引遍历替代
slice::Iter,避免复杂的生命周期绑定,代码更易维护。
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

