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 在 数据结构
每月153次下载
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。