我想知道有没有办法检索与defrecord声明的属性相关联的类型提示。例如,如果我有以下记录定义:
(defrecord Foo [^Integer id ^String description])
我想检索一个Foo
类型的地图,它给出了属性及其提示类型。我知道我可以通过反射获得声明属性的列表:
(->> record .getDeclaredFields (remove #(java.lang.reflect.Modifier/isStatic (.getModifiers #))))
这确实给了我一个声明字段的列表,但它们的类型是Object
。我知道Clojure是一种动态语言,但如果我需要它们的类型会回复给我,那就太好了。
答案 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的答案。看起来字段上的类型提示目前没有用于任何东西,而不是函数参数和返回值的提示。