#cell #clone #mutability #data-structures

clone_cell

与限制性 Clone 形式一起工作的 Cell

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 日

#907Rust 模式

MIT/Apache

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 目前实现了以下类型

  • 所有原始类型,如 i32usizef64 等;
  • 引用:&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类型;
  • 执行浅克隆的类型,如RcWeak;以及
  • clone方法已知是安全的类型,例如仅包含PureClone类型的复合类型。

有关更多信息,请参阅文档。如果您发现任何健全性问题,请告诉我!

贡献

欢迎拉取请求,任何反馈都将受到赞赏!

依赖关系

~235KB