При определении типа структуры и экземпляра, я могу распечатать значение и получить тип реализации "структуры":
(defstruct person :name :age)
(def p (struct person "peter" 30))
user=> p
{:name "peter", :age 30}
user=> (type p)
clojure.lang.PersistentStructMap
Но действительно ли возможно сказать, является ли p экземпляром "человека" типа структуры?
См .: этот пост в группе Google Clojure. В целом групповые архивы представляют собой сундук с сокровищами ...
Примечание: Функциональность структур заменяется записями. Тогда это больше не проблема, потому что записи действительно определяют новый тип, и вы можете проверить с помощью экземпляра ?
, относится ли что-то к записи определенного типа.
Немного некрасиво, но работает:
(require '[clojure.contrib.java-utils :as cj])
(defn struct-instance? [struct-def sm]
(= (cj/wall-hack-field clojure.lang.PersistentStructMap "def" sm)
struct-def))
(struct-instance? person p)
; => true
(struct-instance? person (conj p [:foo 1] [:bar 2]))
; => true
(defstruct foo :k1 :k2)
(struct-instance? foo p)
; => false
Материал из clojure.contrib.java-utils
будет частично доступен в версии 1.2 в clojure.java
, частично в clojure.contrib.java
(я полагаю?), А также в clojure.contrib.java-utils
для обратной совместимости ... Хотя детали все еще могут измениться. В любом случае Майкель прав насчет defrecord
замены defstruct
, так что если вы работаете над 1.2, отдайте предпочтение этому.