什么是Cell

Cell 和 RefCell 都是基于 unsafeCell 来实现的.

Cell 其中T是需要实现copy的

所以Cell只能用于实现了Copy的类型

Cell与Refcell 是实现了内部可变性

展示

  1. use std::cell::Cell;
  2. fn main(){
  3. let c = Cell::new("hello");
  4. let one = c.get();
  5. c.set("qwer");
  6. let two = c.get();
  7. println!("{},{}",one,two);
  8. }

实现机制

在使用set方法的时候 ,会调用replace方法进行替换,返回旧值,然后drop旧值

replace 调用了 mem下的replace 方法 使用ptr下的read跟write 进行操作.

使用Cell::from_mut解决借用冲突

  1. fn is_even(i: i32) -> bool {
  2. i % 2 == 0
  3. }
  4. fn retain_even(nums: &mut Vec<i32>) {
  5. // let mut i = 0;
  6. // for num in nums.iter().filter(|&num| is_even(*num)) {
  7. // nums[i] = *num;
  8. // i += 1;
  9. // }
  10. // nums.truncate(i);
  11. let slice: &[Cell<i32>] = Cell::from_mut(&mut nums[..]).as_slice_of_cells();
  12. let mut i = 0;
  13. for num in slice.iter().filter(|num| is_even(num.get())) {
  14. slice[i].set(num.get());
  15. i += 1;
  16. }
  17. nums.truncate(i);
  18. }