#vec #cell #reference #mutable #interior-mutability #elements #disjoint

vec_cell

一个具有内部可变性和动态检查借用规则的Vec,允许对其元素取不重叠的可变引用

4个版本

0.1.3 2023年4月26日
0.1.2 2023年3月31日
0.1.1 2023年3月27日
0.1.0 2023年3月24日

#475内存管理

48 每月下载量
2 个Crates中使用(通过 arena_system

MPL-2.0 许可证

43KB
730 代码行

vec_cell

具有内部可变性和允许对其元素取不重叠可变引用的Rust Vec。

use vec_cell::VecCell;

// Create `VecCell`.
let vec_cell: VecCell<i32> = VecCell::new();

// Push elements to `VecCell`.
vec_cell.push(0);
vec_cell.push(1);
vec_cell.push(2);

// Take immutable borrows to `VecCell` elements.
{
    assert_eq!(*vec_cell.borrow(0), 0);
    assert_eq!(*vec_cell.borrow(1), 1);
    assert_eq!(*vec_cell.borrow(2), 2);
}

// Take disjoint mutable borrows to `VecCell` elements.
{
    let borrow_mut1 = &mut *vec_cell.borrow_mut(1);
    let borrow_mut2 = &mut *vec_cell.borrow_mut(2);

    *borrow_mut1 = 10;
    *borrow_mut2 = 15;
}

// Pop elements from `VecCell`.
assert_eq!(vec_cell.pop(), 15);
assert_eq!(vec_cell.pop(), 10);
assert_eq!(vec_cell.pop(), 0);

lib.rs:

VecCell 是一个具有内部可变性和动态检查借用规则的 VecVecCell 允许对其元素取不重叠的可变借用。

示例

use vec_cell::VecCell;

let mut vec_cell: VecCell<i32> = VecCell::new();

vec_cell.push(0);
vec_cell.push(1);
vec_cell.push(2);

{
    assert_eq!(*vec_cell.borrow(0), 0);
    assert_eq!(*vec_cell.borrow(1), 1);
    assert_eq!(*vec_cell.borrow(2), 2);
}

{
    let borrow_mut1 = &mut *vec_cell.borrow_mut(1);
    let borrow_mut2 = &mut *vec_cell.borrow_mut(2);

    *borrow_mut1 = 10;
    *borrow_mut2 = 15;
}

assert_eq!(vec_cell.pop(), Some(15));
assert_eq!(vec_cell.pop(), Some(10));
assert_eq!(vec_cell.pop(), Some(0));

依赖关系

~325–790KB
~19K SLoC