例如,如果我有两个不同的记录,但它们共享少数几个公共字段,有没有办法让两个记录共享一个共同的基本记录?看起来协议只允许声明方法签名。
答案 0 :(得分:4)
我认为现在不可能。
defrecord
只是一个宏,您可以使用macroexpand
查看其功能,例如:
(macroexpand '(defrecord User [Name Age]))
因此,如果您想要这样的记录继承,您可能需要实现一个宏来执行此操作。 但我不建议继承是我试图避免的,因为它会导致复杂性。
答案 1 :(得分:4)
您应该针对抽象而不是特定字段进行编程,即使用协议以便记录可以共享公共接口。例如,如果所有记录类型都需要返回'string'属性,则使用'get-string'方法创建一个协议,并将其扩展到每个记录类型。
(defprotocol SQL
(get-string [t]))
(defrecord Thing [name f1 f2]
SQL
(get-string [t] (str name)))
(defrecord AnotherThing [name f1 f2 f3 f4 blah]
SQL
(get-string [t] (str name)))
如果您发现自己为特定协议方法创建了相同的实现,则可以始终“定义”(非公共函数)实现,并将其用作每种记录类型中的实现。