Clojure瞬态使用
我对clojure中的瞬变用法有点迷茫。任何帮助都将不胜感激。 示例代码:Clojure瞬态使用,clojure,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 (tran
(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>
for有一些限制吗?如果是这样,如何将值从持久向量复制到瞬态向量
谢谢。瞬变不应该像那样被猛击。上一个示例仅适用于您不应该依赖的实现细节
for
不起作用的原因是它很懒,而且连接代码>调用永远不会执行,但这不是重点,因为无论如何,您都不应该以这种方式处理瞬态
你应该使用conj
与使用不可变向量的“regular”conj
的方法相同-使用返回值
您试图做的事情可以这样完成:
(defn test-transient [v]
(let [t (transient [])]
(persistent! (reduce conj! t v))))
谢谢你的回复。但我还是很困惑。在这种情况下,我看不出for的用法与clojure网站上的示例有什么大的区别:(defn vrange2[n](loop[I 0 v(transient[])(if(
该recur表达式传递conj的值!回到循环中。对于表达式,不是这样的。好的,明白了。谢谢你,非常感谢。:)
(defn test-transient [v]
(let [t (transient [])]
(persistent! (reduce conj! t v))))