瞬时数据结构总是从现有的持久 Clojure 数据结构创建。从 Clojure 1.1.0 开始,支持向量、哈希映射和哈希集。请注意,并非所有 Clojure 数据结构都支持此功能,但大多数都支持。列表不支持,因为这样做没有好处。
您可以通过调用 **transient** 获取数据结构的瞬时“副本”。这将创建一个新的瞬时数据结构,它是源的副本,并具有相同的性能特征。事实上,它大多是源数据结构,并突出了瞬时数据结构的第一个特性 - 创建一个瞬时数据结构是 O(1) 操作。它与源共享结构,就像持久副本共享结构一样。
瞬时数据结构的第二个特性是创建它不会修改源,并且无法通过使用瞬时数据结构来修改源。您的源数据一如既往地保持不可变和持久。
瞬时数据结构支持源的只读接口,即您可以像使用持久向量一样调用 **nth**、**get**、**count** 并对瞬时向量进行函数调用。
瞬时数据结构不支持源数据结构的持久接口。**assoc**、**conj** 等都将抛出异常,因为瞬时数据结构不是持久的。因此,您无法意外地将瞬时数据结构泄漏到需要持久数据结构的上下文中。
瞬时数据结构支持一组并行的“更改”操作,这些操作具有类似的名称,后跟 **!** - **assoc!**、**conj!** 等。它们与相应的持久操作执行相同的功能,只是返回值本身是瞬时的。尤其要注意的是,瞬时数据结构并非设计为就地修改。您必须捕获并使用返回值在下一个调用中。这样,它们支持与它们替换的功能性持久代码相同的代码结构。如示例所示,这将允许您轻松地提高代码的性能,而无需进行结构更改。
完成构建结果后,您可以通过对瞬时数据结构调用 **persistent!** 来创建一个持久数据结构。此操作也是 O(1) 操作。在调用 **persistent!** 后,不应再使用瞬时数据结构,并且所有操作都将抛出异常。对于您可能创建的任何别名,这也将适用。