Clojure记录:如何在给定属性名称的情况下获取提示类型

时间:2011-02-21 20:02:06

标签: clojure record

我想知道有没有办法检索与defrecord声明的属性相关联的类型提示。例如,如果我有以下记录定义:

(defrecord Foo [^Integer id ^String description])

我想检索一个Foo类型的地图,它给出了属性及其提示类型。我知道我可以通过反射获得声明属性的列表:

(->> record .getDeclaredFields (remove #(java.lang.reflect.Modifier/isStatic (.getModifiers #))))

这确实给了我一个声明字段的列表,但它们的类型是Object。我知道Clojure是一种动态语言,但如果我需要它们的类型会回复给我,那就太好了。

2 个答案:

答案 0 :(得分:3)

类型提示不会保留在任何地方。您可以通过为defrecord编写包装宏来保存类型信息,从而管理这些信息。你可以,例如生成记录类型的构建函数,该函数使用字段上的元数据来丰富实例:

(defrecord-hinted Foo [^Integer id ^String description])

; you could then acces the type information with
(->> (meta (make-Foo 42 "forty two")) 
     ::field-types
     :id) ; => java.lang.Integer.class

答案 1 :(得分:1)

查看this question的答案。看起来字段上的类型提示目前没有用于任何东西,而不是函数参数和返回值的提示。