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 模式
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