#value #cell #contained #borrowed #replace #linked #self

lineage

一个单元格,可以在其值仍然被借用的情况下替换包含的值

1 个不稳定版本

0.4.0 2023年9月30日

#7 in #contained

MIT 许可证

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

无运行时依赖