需求分析

我现在有一个 points Arc<DashMap<u64,Arc<DashMap<String,Vec>>>> 字段,以及 freeze 字段 Vec<Arc<DashMap<u64,Arc<DashMap<String,Vec>>>>>, 当 points 到达一定数量的时候,需要将 points 放到 freeze 中, 但是直接Copy太消耗内存了。

take

pub fn take<T>(dest: &mut T) -> T
where
    T: Default,
Replaces dest with the default value of T, returning the previous dest value.
将 dest 替换为默认值 T,返回上一个 dest 值。

If you want to replace the values of two variables, see swap.
如果要替换两个变量的值,请参阅 swap。
If you want to replace with a passed value instead of the default value, see replace.
如果要使用传递的值而不是默认值进行 replace,请参阅 replace。

code version 0.0


use std::cell::RefCell;
use std::rc::Rc;

#[derive(Debug)]
struct Point {
    x: i32,
    y: i32,
}

struct Example {
    points: Rc<RefCell<Vec<Point>>>,
    freeze: Vec<Rc<RefCell<Vec<Point>>>>,
}

impl Example {
    fn new() -> Self {
        Self {
            points: Rc::new(RefCell::new(Vec::new())),
            freeze: Vec::new(),
        }
    }

    fn add_points_to_freeze(&mut self) {
        // 使用 `take` 方法将 points 的内容转移到新的 Vec 中
        let new_points = {
            let mut points_borrow = self.points.borrow_mut();
            std::mem::take(&mut *points_borrow) // 清空原有的 points
        };

        // 将新创建的 Vec 包装在 Rc<RefCell> 中并添加到 freeze
        self.freeze.push(Rc::new(RefCell::new(new_points)));
    }
}

fn main() {
    let mut example = Example::new();
    
    // 向 points 中添加一些数据
    example.points.borrow_mut().extend(vec![
        Point { x: 1, y: 2 },
        Point { x: 3, y: 4 },
    ]);

    example.add_points_to_freeze();

    // 打印结果
    println!("{:?}", example.freeze[0].borrow()); // freeze 中的数据
    println!("{:?}", example.points.borrow()); // points 现在应该是空的
}
最后修改:2024 年 09 月 14 日
如果觉得我的文章对你有用,请随意赞赏