![]() |
1
25
有两个好方法可以做到这一点。哪种最好取决于具体情况。 首先是反思: (clojure.lang.Reflector/invokeConstructor (resolve (symbol "Integer")) (to-array ["16"]))
就像打电话一样
第二种选择是尽可能快,但有点复杂,并使用
(defn make-factory [classname & types] (let [args (map #(with-meta (symbol (str "x" %2)) {:tag %1}) types (range))] (eval `(fn [~@args] (new ~(symbol classname) ~@args))))) (def int-factory (make-factory "Integer" 'String)) (int-factory "42")
关键是评估定义匿名函数的代码,如
当您专门处理由
(defn record-factory [recordname] (let [recordclass ^Class (resolve (symbol recordname)) max-arg-count (apply max (map #(count (.getParameterTypes %)) (.getConstructors recordclass))) args (map #(symbol (str "x" %)) (range (- max-arg-count 2)))] (eval `(fn [~@args] (new ~(symbol recordname) ~@args))))) (defrecord ExampleRecord [a b c]) (def example-record-factory (record-factory "ExampleRecord")) (example-record-factory "F." "Scott" 'Fitzgerald) |
![]() |
2
4
查看Michal对这个宏的局限性的评论。 |
![]() |
4
3
在Clojure1.3中,defrecord将使用前面带有“->”的记录名自动定义工厂函数。类似地,采用映射的变量将是以“map->”开头的记录名。
这样的宏应该可以从记录类型的字符串名称创建实例:
|
![]() |
KiraHoneybee · 具有构造函数参数的模板化类 3 年前 |
![]() |
nick2225 · 隐式调用复制构造函数? 3 年前 |
![]() |
nohaga · 为什么在本例中p3需要默认构造函数? 3 年前 |
![]() |
Aadil Hoda · 为什么类类型的成员需要初始化? 3 年前 |
![]() |
EloiGG · 具有任意类型的变量的可数的C++函数 3 年前 |