4个版本

新版本 0.1.3 2024年8月20日
0.1.2 2024年1月12日
0.1.1 2023年5月9日
0.1.0 2023年4月7日

#856数据结构

Download history 4/week @ 2024-07-04 1/week @ 2024-07-18 12/week @ 2024-07-25 141/week @ 2024-08-15

每月153次下载

MIT/Apache

15KB
236

许多结构,如现实世界的关系模型,涉及别名引用,这可以在Rust中使用如 Rc<T> 这样的类型进行建模。然而,Rc<T> 是不可变的,这在初始化别名结构时往往是有问题的。正因为如此,内部可变性通常被使用,如 Rc<RefCell<T>>

遗憾的是,没有安全的方法可以将 Rc<RefCell<T>> 转换为 Rc<T>,这意味着这些别名结构通常永久地保留在其可变形式。除了导致后续变动的不可确定性外,这也引入了不效率,因为所有的访问(甚至是不可变的)都必须通过 RefCell<T> 的运行时级借用逻辑。为了解决这个问题,mut-rc 引入了一种新的类型,称为 MutRc<T>

MutRc<T>在本质上等同于Rc<RefCell<T>>,但在其可变生命周期结束时,可以“最终化”为普通的Rc<T>,同时保留创建的别名拓扑。

示例

# use std::rc::Rc;
# use mut_rc::MutRc;
let a: MutRc<i32> = 45.into(); // create a MutRc<i32> value and an alias
let b = a.clone();

a.with_mut(|x| *x *= 2).unwrap(); // mutate the value via callback

let fa: Rc<i32> = a.finalize().unwrap(); // finalize the values into Rc<i32>
let fb: Rc<i32> = b.finalize().unwrap();

assert_eq!(*fb, 90);
assert!(Rc::ptr_eq(&fa, &fb)); // aliasing topology is preserved

无标准

此crate通过禁用默认功能支持在no-std环境中构建。

[dependencies]
mut-rc = { version = "...", use-default-features = false }

请注意,在这种情况下仍然需要alloc crate。

无运行时依赖