在定义结构类型和实例时,我可以打印该值并获取“struct”实现类型:
(defstruct person :name :age)
(def p (struct person "peter" 30))
user=> p
{:name "peter", :age 30}
user=> (type p)
clojure.lang.PersistentStructMap
但是有可能判断p是否是结构类型“person”的实例?
答案 0 :(得分:8)
请参阅:this post in the Clojure Google Group. 一般来说,集体档案是一个宝箱......
注意:结构的功能由记录替换。然后这不再是问题,因为记录确实定义了新类型,您可以使用instance?
检查某些内容是否属于某种类型的记录。
答案 1 :(得分:4)
有点难看,但它确实有效:
(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
中的内容将部分在clojure.java
中提供,部分位于clojure.contrib.java
(我猜?),以及clojure.contrib.java-utils
中的内容可用于向后兼容。 ..虽然细节可能仍会改变。无论如何,Meikel对defrecord
取代defstruct
是对的,所以如果你正在研究1.2,那就更喜欢。