我在clojure中使用瞬态时有点迷失.任何帮助将不胜感激.示例代码:
(defn test-transient [v]
(let [b (transient [])]
(for [x v] (conj! b x))
(persistent! b)))
user> (test-transient [1 2 3])
[]
Run Code Online (Sandbox Code Playgroud)
我试图在返回之前使其持久化,结果是:
(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>
Run Code Online (Sandbox Code Playgroud)
但如果我使用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]
Run Code Online (Sandbox Code Playgroud)
是否有一些约束?如果是这样,我如何将值从持久向量复制到瞬态?
谢谢.
瞬态不应该像这样在原地进行.您的上一个示例仅适用于您不应依赖的实施细节.
之所以for不起作用的原因是它是懒惰的并且conj!调用永远不会被执行,但除此之外,因为你不应该以这种方式使用瞬态.
您应该使用conj!与使用conj带有不可变向量的"常规"相同的方法- 使用返回值.
您要做的事情可以像这样完成:
(defn test-transient [v]
(let [t (transient [])]
(persistent! (reduce conj! t v))))
Run Code Online (Sandbox Code Playgroud)