我想知道有没有办法检索与defrecord声明的属性相关联的类型提示.例如,如果我有以下记录定义:
(defrecord Foo [^Integer id ^String description])
Run Code Online (Sandbox Code Playgroud)
我想检索一个Foo类型的地图,它给出了属性和它们的暗示类型.我知道我可以通过反射获得声明属性的列表:
(->> record .getDeclaredFields (remove #(java.lang.reflect.Modifier/isStatic (.getModifiers #))))
Run Code Online (Sandbox Code Playgroud)
这确实给了我一个声明字段列表,但它们的类型是Object.我知道Clojure是一种动态语言,但是当我需要它们时,它会很好地回馈给我.
类型提示不保存在任何地方。您可以通过为 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
Run Code Online (Sandbox Code Playgroud)