Могу ли я создать изменяемое состояние внутри записей Clojure? - PullRequest
9 голосов
/ 05 апреля 2011

Я рассматриваю возможность использования записей Clojure для сопоставления с изменяющимися сущностями в моей программе. Они изменчивы? Или вам нужно использовать дополнительные ссылки в записях? Я немного запутался в этом

Ответы [ 2 ]

12 голосов
/ 05 апреля 2011

Стоит посмотреть Фантастическое видео Рича Хикки о личности и состоянии .

Записи предназначены для неизменности и для сохранения состояния чего-либо как значения.

Чтобы смоделировать состояние изменяющегося объекта, я бы рекомендовал использовать ссылку , которая ссылается на неизменяемое значение , которое представляет текущее состояние.Вы можете использовать записи для неизменного состояния, но часто проще просто использовать простую карту.

Простой пример, где изменяемое состояние - это табло для игры:

; 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}
5 голосов
/ 05 апреля 2011

Я обнаружил, что гораздо чаще ставит записи в ссылках, чем ссылки в записях .совет Микиры об использовании простой карты звучит очень хорошо.

Начните с карты и переключайтесь на что-то менее гибкое, когда это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...