You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 06:33:17