2011-04-05 9 views

risposta

12

Vale la pena guardare Rich Hickey's fantastic video on identity and state.

I record sono progettati per essere immutabili e memorizzare lo stato di qualcosa come valore.

Per modellare lo stato di un'entità che cambia, si consiglia di utilizzare un riferimento che si riferisce a un valore immutabile che rappresenta lo stato corrente. Puoi usare i record per lo stato immutabile, ma spesso è più semplice usare una mappa semplice.

Un semplice esempio, dove lo stato mutabile è un quadro di valutazione per un gioco:

; 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} 
+2

Sia alter che update-in passano automaticamente tutti gli argomenti che non capiscono, quindi questo può essere più conciso (e in modo più leggibile) scritto come '(altera punteggi aggiornamento-in [giocatore] + importo)'. – amalloy

+0

@amalloy - grazie! buono per imparare un nuovo trucco :-) hanno aggiornato – mikera

5

ho scoperto che ho molto più comunemente put record in arbitri di arbitri nei record. il consiglio di mikira di usare una mappa semplice suona molto bene.

Inizia con una mappa e passa a qualcosa di meno flessibile quando è necessario.

Problemi correlati