2

我对在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]

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

谢谢你。

4

1 回答 1

6

瞬态不应该像那样被就地打击。您的最后一个示例仅适用于您不应该依赖的实现细节。

for不起作用的原因是它是惰性的,并且conj!永远不会执行调用,但这不是重点,因为无论如何您都不应该以这种方式使用瞬变。

您应该使用与使用带有不可变向量conj!的“常规”相同的方式- 通过使用返回值。conj

您正在尝试做的事情可以这样完成:

(defn test-transient [v]
  (let [t (transient [])]
    (persistent! (reduce conj! t v))))
于 2012-09-12T10:51:04.837 回答