我正在考虑使用Clojure记录映射到程序中不断变化的实体。他们是可变的吗?或者你需要在记录中使用额外的参考?我对此有点困惑
答案 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建议使用简单的地图听起来非常好。
从地图开始,并在必要时切换到不太灵活的东西。