2012-10-31 17 views
32

Mentre defrecord è la forma preferita -per la valigetta- generale Clojure per definire una "entità", in ClojureScript si possono trovare molti più riferimenti a deftype, come risulta variousdocumentation.DEFTYPE vs defrecord

Qual è la differenza tra le due forme? Quale dovrebbe preferire?

risposta

43

deftype crea un oggetto bare-bone che implementa un protocollo.

defrecord crea una mappa persistente immutabile che implementa un protocollo.

Quale da utilizzare dipende da ciò che si desidera. Vuoi una struttura dati ClojureScript completa? Quindi usa un record. Vuoi solo una cosa nuda che non fa altro che soddisfare un protocollo? Quindi usa un tipo.

I due bit di documentazione che si riferiscono usano i tipi perché stanno cercando di illustrare i protocolli al livello più elementare, ei tipi hanno meno "successo" dei record, per così dire.

Tuttavia, la maggior parte degli usi reali di oggetti simili a oggetti in Clojure/ClojureScript devono memorizzare campi di dati insieme all'oggetto, e per questo è necessario utilizzare enfaticamente un record, per lo stesso motivo si dovrebbe usare uno qualsiasi dei Le collezioni immutabili di Clojure.

Problemi correlati