【问题标题】:Clojure Vector of RefsRefs 的 Clojure 向量
【发布时间】:2010-11-05 14:29:48
【问题描述】:

创建不同参考向量的最简单方法是什么?

使用(repeat 5 (ref nil)) 将返回一个列表,但它们都将引用相同的引用:

user=> (repeat 5 (ref nil))
(#<Ref@16ef71: nil> #<Ref@16ef71: nil> #<Ref@16ef71: nil> #<Ref@16ef71: nil> #<R
ef@16ef71: nil>)

(replicate 5 (ref nil)) 的结果相同:

user=> (replicate 5 (ref nil))
(#<Ref@1d88db7: nil> #<Ref@1d88db7: nil> #<Ref@1d88db7: nil> #<Ref@1d88db7: nil>
 #<Ref@1d88db7: nil>)

【问题讨论】:

    标签: vector clojure ref


    【解决方案1】:
    user> (doc repeatedly)
    -------------------------
    clojure.core/repeatedly
    ([f])
      Takes a function of no args, presumably with side effects, and returns an infinite
      lazy sequence of calls to it
    nil
    
    user> (take 5 (repeatedly #(ref nil)))
    (#<Ref@1f10a67: nil> #<Ref@1e2161d: nil> #<Ref@1a034d: nil> #<Ref@1cee792: nil> #<Ref@c5577c: nil>)
    us
    

    【讨论】:

    • 然后换行 (vec (take 5 (repeatedly #(ref nil)))))
    【解决方案2】:

    好吧,这很恶心,但它确实有效:

    user=> (map (fn [_] (ref nil)) (range 5))
    (#<Ref@27147d: nil> #<Ref@b248c8: nil> #<Ref@c86116: nil> #<Ref@5e06ef: nil> #<Ref@19719f: nil>)
    

    返回一个 LazySeq,所以如果你想要/需要一个向量,那么只需使用:

    user=> (vec (map (fn [_] (ref nil)) (range 5)))
    [#<Ref@5bf9cf: nil> #<Ref@6dbfb0: nil> #<Ref@43f787: nil> #<Ref@2fe9bf: nil> #<Ref@9b1e15: nil>]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 2017-01-07
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多