我有一堆实现协议(protocol) P 的记录 (A B C)。
我想编写一个方法,该方法将选择一种记录类型,构造它,然后调用它的方法。
例如,如果我有一个记录列表
(def types '(A B C))
我想做类似 (->(first types) 1 2 3)
最佳答案
嗯,函数也是值,可以在数据结构中存储和检索。因此,您应该能够以某种方便的格式存储您想要从中选择的构造函数并从那里使用它们。类似于:
(defrecord foo [x y])
(defrecord bar [x y z])
(def constructors [->foo ->bar])
((first constructors) 4 5) ;;=> #user.foo{:x 4, :y 5}
;;or
(apply (second constructors) [20 true :baz]) ;;=> #user.bar{:x 20, :y true, :z :baz}
(-> (second constructors) (apply '(59 -30 false))) ;;=> #user.bar{:x 59, :y -30, :z false}
或者您甚至可以完全跳过数据结构:
(defn quxx [n a-map]
((if (< 25 n) map->foo map->bar) a-map))
(quxx 2 {:x 3 :y 9 :z -200}) ;;=> #user.bar{:x 3, :y 9, :z -200}
(quxx 29 {:x 3 :y 9 :z -200}) ;;=> #user.foo{:x 3, :y 9, :z -200}
关于Clojure元编程动态选择记录(初学者!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29712173/