我正在尝试获取瞬态映射中所有键的seq:
(keys {3 4 5 6 7 8})
提供(3 5 7)
正如我所料,但是:
(keys (transient {3 4 5 6 7 8}))
给出
#<CompilerException java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.PersistentArrayMap$TransientArrayMap (NO_SOURCE_FILE:346)>
在同一个音符上,我如何使用瞬态地图进行处理?
(map identity {3 4 5 6})
给出
([3 4] [5 6])
但是
(map identity (transient {3 4 5 6}))
给出
#<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.PersistentArrayMap$TransientArrayMap>
答案 0 :(得分:6)
由于懒惰和可变性之间的相互作用,这实际上是不可能的。 (keys m)
始终返回由不可变m
数据结构支持的惰性序列,并根据需要计算元素。但如果m
是一个瞬态,它可能随时改变,这会破坏懒惰的密钥序列。你真的打算不要做任何过于花哨的事情;而且因为创建数据结构的瞬态版本或持久版本非常便宜,如果你真的想要做一些奇特的事情,那么来回走动几次并不是太繁重。
答案 1 :(得分:1)
我认为有一种方法可以处理瞬态,就像你在持久性结构上工作一样。您需要使用persistence!
user> (map identity (persistent! (transient {3 4 5 6})))
([3 4] [5 6])
您可以从Clojure docs了解有关瞬变的更多信息。