#lazy-evaluation #clone #immutability #immutable-data

lazy-cogs

Lazy Cogs 是一个惰性可克隆数据结构的实现

1 个稳定版本

1.0.0 2024年4月14日

#1151 in 数据结构

自定义许可

54KB
1.5K SLoC

Lazy Cogs

一个使用不可变数据结构概念的 Rust 库,实现了简单的惰性可克隆数据结构。

什么是惰性克隆?

惰性克隆是一种在 O(1) 时间内克隆数据结构的技术。这意味着克隆数据结构所需的时间是恒定的,并且“不依赖于结构中包含的数据量”。

这是如何实现的?

引用计数。Lazy Cogs 在幕后使用 Clone::clone 而不是 Rc::clone(对于我们的 Atomic 变体)。这是因为我们假设克隆的结构不会被修改。所以我们只是将原始数据的引用抛出。

不可变意味着我不能改变数据吗?

不是的。不可变意味着它最有可能不会被修改。但实际上你可以修改数据。当数据被修改时,实际上会进行 Clone::clone 操作。在我们的内置实现中,我们确保每次尝试修改数据都不会影响任何其他克隆。

这就是惰性的美妙之处。为什么我要花费大量时间克隆那些可以以低廉的引用成本克隆的数据?我只有在绝对需要时才会进行克隆。

为什么使用 Lazy Cogs?

我们提供了一个 LazyClone 特性以及两个惰性克隆包装器 LcAlc(线程安全)。这个特性有助于定义你的数据结构如何进行惰性克隆。而包装器用于包装你的结构体中不实现 LazyClone 的数据。

值得注意的是,实现 Copy 的数据不值得用 LcAlc 包装,也不应该实现 LazyClone。此外,如果有结构体已经完成了这项工作并实现了 LazyClone,建议使用它而不是用 LcAlc 包装另一个不能通过 LcAlc 实现惰性克隆的结构体。

LazyClone 特性

这是一个具有三个方法的特性

  • lazy:生成数据的惰性克隆
  • eager:生成数据的急切克隆(普通克隆)。当你知道数据将要被修改时很有用。
  • is_mutable:验证结构是否可以在不影响其懒克隆的情况下进行修改。

此特性行由 LcAlc 实现。

集合

Lazy Cogs 还提供了一些现成的懒实现集合。目前只有 LazyVecLazyList(两者都有 Atomic 变体),它们分别是 VecLinkedList 的实现。它们不是简单的包装,它们有一些内部逻辑,使得它们是懒的。

无运行时依赖