#cell #ghost #shared-data #experimental #borrow #borrowing #ghost-cell

no-std singleton-cell

一种更强大的Ghost Cell,允许使用任何单例作为键

5个不稳定版本

0.3.1 2022年5月2日
0.3.0 2021年8月29日
0.2.0 2021年8月1日
0.1.1 2021年7月18日
0.1.0 2021年7月18日

#1259 in Rust模式

MIT 许可证

16KB
207

Version 0.3.1 MIT License

此库提供了一个安全、零开销的接口,通过访问另一个单例令牌来保护对共享数据的访问。它是GhostCell的扩展,允许使用除品牌令牌之外更通用的单例,使数据能够 'static

此库还提供了两种单例实现

  • 通过 with_token 使用GhostCell的scoped、品牌令牌
  • 通过 new_singleton 简单地创建一次单例结构体

为什么选择SCell而不是

GhostCell(以及来自qcell crate的LCell)

  • 使用具体的单例类型,SCell可以是 'static 并因此存储在 'static 数据结构中。
  • SCell的使用不必严格受限。
  • SCell更为灵活,并提供了一个 with_token 方法来模拟GhostCell。
  • 可以使用SCell使用擦除的零大小引用,从而实现真正的零成本抽象。

来自qcell crate的其他Cells

  • 创建SCell不需要任何对拥有类型的引用。
  • SCells提供 from_mut 和类似接口:它们类似于Cell和GhostCell的结构。
  • SCells没有运行时成本。

为什么不呢?

  • 与GhostCell不同,SCell更通用的用法尚未经过形式化证明。
  • 涉及SCell的类型签名可能比其他选项略为冗长。

示例

请参阅示例目录以获取一些代码示例

new_singleton(pub Lock);
pub fn main() {
    let mut lock1 = Lock::new().expect("Called main twice");
    let cell1 = SCell::new(0);
    let cell2 = &cell1;

    cell1.borrow_mut(&mut lock1) += 1;

    assert_eq!(1, *cell2.borrow(&lock1));
}

依赖关系

~20KB