获取Clojure结构类型的名称?

时间:2010-06-11 05:56:40

标签: struct clojure

在定义结构类型和实例时,我可以打印该值并获取“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”的实例?

2 个答案:

答案 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,那就更喜欢。