需求分析
我现在有一个 points Arc<DashMap<u64,Arc<DashMap<String,Vec
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 现在应该是空的
}