#interior-mutability #vec #refcell

veccell

提供 VecCell,Vec 的具有内部可变性的变体

6 个版本 (3 个破坏性版本)

0.4.0 2022 年 7 月 11 日
0.3.0 2022 年 7 月 10 日
0.2.1 2022 年 7 月 8 日
0.1.1 2022 年 7 月 3 日
0.1.0 2022 年 6 月 28 日

#1274 in Rust 模式

MIT/Apache

51KB
743

VecCell

Vec 的一个变体,具有内部可变性,其中一个元素可以可变借用,同时可以不可变借用多个其他元素。

您会使用这个包,如果:

  • 您需要一个具有内部可变性的 Vec
  • 您一次只想对一个元素进行可变访问
  • 当元素被可变借用时,您想对所有其他元素进行不可变访问
  • 您需要一个常量内存成本来进行别名检查

如果您需要其他东西,则:

  • 您不需要内部可变性(您可以使用 Vec<T> 代替)
  • 当元素被可变借用时,您不需要访问其他元素(您可以使用 RefCell<Vec<T>> 代替)
  • 您想一次对多个元素进行可变访问(您可以使用 Vec<RefCell<T>> 代替)
  • 您需要跨多个线程共享数组(您可以使用 Vec<Mutex<T>>Arc<Vec<Mutex<T>>> 代替)

安装

运行 cargo add veccell 或在 Cargo.toml 中添加以下内容

[dependencies]
veccell = "0.4"

示例

VecCell 允许一个元素被可变借用,其他元素可不可变访问

use veccell::VecCell;

let mut arr: VecCell<usize> = VecCell::new();

arr.push(32);
arr.push(48);
arr.push(2);

let mut third = arr.borrow_mut(2).unwrap(); // Borrow the third element mutably
let first = arr.borrow(0).unwrap(); // Borrow the first element immutably

*third *= *first; // Multiply the third element by the first element

println!("{}", third); // Prints 64
std::mem::drop(third); // Drop the mutable borrow

println!("{}", arr.borrow(2).unwrap()); // Also prints 64

然而,为了防止别名,当元素被可变借用时,它不能被不可变借用

use veccell::VecCell;

let mut arr: VecCell<usize> = VecCell::new();

arr.push(32);
arr.push(48);
arr.push(8);

let mut third = arr.borrow_mut(2).unwrap(); // Borrow the third element mutably

// Here, arr.borrow(2) returns None,
// because the third element is already borrowed mutably.
let third2 = arr.borrow(2);

assert!(third2.is_none());

std::mem::drop(third);

VecCell 仅存储两个额外的信息

  • 当前哪个元素被可变借用(通过 mut_borrow 访问)
  • 有多少元素被不可变借用(通过 borrows 访问)

这种做法将所有元素都放置在内存中相邻的位置,如果它们的填充允许的话,但缺点是规则比预期的更严格。

要借用元素的可变版本,不能同时可变或不可变地借用任何元素。

use veccell::VecCell;

let mut arr: VecCell<usize> = VecCell::new();

arr.push(32);
arr.push(48);
arr.push(8);

let second = arr.borrow(1).unwrap();

let third = arr.borrow_mut(2);

// VecCell has no way of telling that the existing immutable borrow (`second`)
// isn't borrowing the third element.
assert!(third.is_none());

std::mem::drop(third);

let first = arr.borrow_mut(0);

// VecCell can only allow one mutable borrow at a time
assert!(arr.borrow_mut(1).is_none());

serde

serde 已支持。要使用它,请启用 serde 功能。

[dependencies]
veccell = { version = "0.4", features = ["serde"] }

许可证

本项目根据 MIT 许可证和 Apache v2.0 许可证双重许可。您在使用此库时可以选择其中之一。

对该仓库的任何贡献都必须在两种许可证下可用。

依赖项

~170KB