2012-10-31 9 views
32

Podczas defrecord jest preferowaną formą -dla ogólnym CASE- w Clojure dla definiowania „podmiot”, w jednym ClojureScript można znaleźć znacznie więcej odniesień do deftype, co znajduje odzwierciedlenie w variousdocumentation.deftype vs. defrecord

Jaka jest różnica między obiema formami? Które powinno się preferować?

Odpowiedz

43

tworzy obiekt typu bare-bones, który implementuje protokół.

defrecord tworzy niezmienną mapę trwałą, która implementuje protokół.

Który użyć zależy od tego, co chcesz. Czy chcesz mieć pełną strukturę danych ClojureScript? Następnie użyj rekordu. Czy chcesz po prostu czegoś, co nie ma nic wspólnego z protokołem? Następnie użyj typu.

Dwa fragmenty dokumentacji, do których odwołujesz się, są używane, ponieważ próbują zilustrować protokoły na najbardziej podstawowym poziomie, a typy mają mniej "akcji" niż zapisy, że tak powiem.

Jednak większość rzeczywistych zastosowań obiektów podobnych do obiektów w Clojure/ClojureScript musi przechowywać pola danych wraz z obiektem, i do tego należy zdecydowanie używać rekordu, z tego samego powodu należy użyć dowolnego z Niezmienne kolekcje Clojure.