Clojure瞬态使用

时间:2012-09-12 09:59:31

标签: clojure

我在clojure中使用瞬态时有点迷失。任何帮助将不胜感激。 示例代码:

(defn test-transient [v]
    (let [b (transient [])]
        (for [x v] (conj! b x))
        (persistent! b)))

user> (test-transient [1 2 3])
[]

我试图在返回之前使其持久化,结果是:

(defn test-transient2 [v]
    (let [b (transient [])]
        (for [x v] (conj! b x))
        (persistent! b)
        b))

user> (test-transient2 [1 2 3])
#<TransientVector clojure.lang.PersistentVector$TransientVector@1dfde20>

但如果我使用conj!它似乎工作正常:

(defn test-transient3 [v]
    (let [b (transient [])]
    (conj! b 0)
    (conj! b 1)
    (conj! b 2)
    (persistent! b)))

user> (test-transient3 [1 2 3])
[0 1 2]

是否有一些约束?如果是这样,我如何将值从持久向量复制到瞬态?

谢谢。

1 个答案:

答案 0 :(得分:6)

瞬态不应该像这样在原地进行。您的上一个示例仅适用于您不应该依赖的实施细节。

for不起作用的原因是它是懒惰的并且conj!调用永远不会被执行,但除此之外,因为你不应该以这种方式使用瞬态

您应该使用conj!,就像使用带有不可变向量的“常规”conj一样 - 使用返回值。

你要做的事情可以像这样完成:

(defn test-transient [v]
  (let [t (transient [])]
    (persistent! (reduce conj! t v))))