9 个版本
0.4.0 | 2022 年 11 月 28 日 |
---|---|
0.3.1 | 2021 年 10 月 10 日 |
0.2.0 | 2021 年 9 月 25 日 |
0.1.4 | 2021 年 9 月 15 日 |
#907 在 Rust 模式
21KB
237 行
clone_cell
clone_cell 提供了一个 Cell
实现,该实现适用于保证其 clone
方法不会通过 &self
引用修改 Cell
内容的类型。这通过提供的 PureClone
trait 来强制执行,它是 Clone
的子trait(也是 Copy
的逻辑超trait)。它仅对具有兼容的 clone
方法的类型实现。
概述
此 crate 提供的 Cell
实现旨在作为 std::cell::Cell
的直接替换。它可以与类似 值 的类型一起工作,例如 Rc<T>
、Weak<T>
(共享指针本身就像 值;是所指向的对象像 引用),Option<T: PureClone>
等。一些有说服力的用例包括实现观察者模式和将 Cell
与 clone-on-write 或不可变集合结合,以实现数据结构的有效共享。
PureClone
目前实现了以下类型
- 所有原始类型,如
i32
、usize
、f64
等; - 引用:
&T
; Rc<T>
和Weak<T>
;Option<T: PureClone>
;以及- 元组:
(A: PureClone, ...)
。
请参阅PureClone
以获取完整列表。
示例
在下面的示例中,我们将在Cell
中存储一个Rc<T>
,并在以后检索其副本。
use std::rc::Rc;
use clone_cell::cell::Cell;
let x = Cell::new(Rc::new(0));
x.set(Rc::new(42));
assert_eq!(*x.get(), 42);
有关更多信息,请参阅Cell
的文档。
还提供了一个过程宏,用于为用户类型安全地派生PureClone
。
use std::rc::Rc;
use clone_cell::{cell::Cell, clone::PureClone};
// Note: This also generates a `Clone` impl.
#[derive(PureClone)]
struct Foo<T> {
p: Rc<T>, // `Rc<T>` is always `PureClone`.
t: Option<T>, // `Option<T>` is `PureClone` if `T` is.
x: i32, // `i32` is `PureClone`.
}
let p = Rc::new(-42);
let f = Cell::new(Foo {
p: p.clone(),
t: Some(0),
x: 0,
});
f.set(Foo {
p,
t: Some(42),
x: 21,
});
assert_eq!(*f.get().p, -42);
assert_eq!(f.get().t, Some(42));
assert_eq!(f.get().x, 21);
有关更多信息,请参阅clone
模块的文档。
限制
- 与
std::cell::Cell
类似,此Cell
是!Sync
。 - 由于使用了新的特质
PureClone
,因此没有现成的对第三方crate类型的支持。
安全性
这是安全的,因为PureClone
是一个unsafe
特质,并且对所有PureClone
实现进行了检查。此特质适用于
Copy
类型;- 执行浅克隆的类型,如
Rc
和Weak
;以及 - 其
clone
方法已知是安全的类型,例如仅包含PureClone
类型的复合类型。
有关更多信息,请参阅文档。如果您发现任何健全性问题,请告诉我!
贡献
欢迎拉取请求,任何反馈都将受到赞赏!
依赖关系
~235KB