我可以在Clojure记录中创建可变状态吗?

时间:2011-04-05 15:14:21

标签: clojure

我正在考虑使用Clojure记录映射到程序中不断变化的实体。他们是可变的吗?或者你需要在记录中使用额外的参考?我对此有点困惑

2 个答案:

答案 0 :(得分:12)

值得关注Rich Hickey's fantastic video on identity and state

记录设计为不可变,并将某些内容的状态存储为值。

为了模拟变化的实体的状态,我建议使用一个引用表示当前状态的不可变值的引用。您可以将记录用于不可变状态,但通常只使用简单的映射更简单。

一个简单的例子,其中可变状态是游戏的记分板:

; set up map of current scores for each player
(def scores 
  (ref 
    {:mary 0 
     :joe  0   }))

; create a function that increments scores as a side effect
(defn add-score [player amount]
  (dosync
    (alter scores update-in [player] + amount)))

; add some scores
(add-score :mary (rand-int 10))
(add-score :joe (rand-int 10))

; read the scores
@scores
=> {:mary 6, :joe 1}

答案 1 :(得分:5)

我发现我更常见的是将记录放在refs而不是记录中的refs 。 mikira建议使用简单的地图听起来非常好。

从地图开始,并在必要时切换到不太灵活的东西。