1 个不稳定版本
0.4.0 | 2023年9月30日 |
---|
#7 in #contained
15KB
308 行
Lineage
一个小型的 Rust crate,提供一种可以在前一个值仍然不可变借用的情况下替换其包含值的单元格类型
impl Lineage {
pub fn new(value: T) -> Self;
pub fn get(&self) -> &T;
pub fn set(&self, value: T);
pub fn clear(&mut self);
}
注意,可以使用 Lineage::set
函数通过仅使用 &self
将新值插入到单元格中。这意味着 Lineage
可能仍然被之前的 Lineage::get
调用所借用,但你仍然可以替换包含的值。内部替换的值被添加到一个链表中,直到你调用 Lineage::clear
或丢弃 Lineage
才会清除。
let lineage: Lineage<String> = Lineage::new(String::from("ONE"));
let s1 = lineage.get();
lineage.set(String::from("TWO"));
let s2 = lineage.get();
assert_eq!(s1, "ONE");
assert_eq!(s2, "TWO");
安全性
对于这种类型的实用程序 crate,实现使用了 unsafe
。我们有一系列测试来查找未定义的行为,这些测试都可以在本地或使用 miri 运行。miri
是一个在虚拟运行时中执行 Rust 应用程序并对各种未定义行为敏感的出色工具。
# run tests normally
cargo test
# install miri
rustup toolchain install nightly
rustup +nightly component add miri
# run tests in miri
cargo clean
cargo +nightly miri test