我在我的Clojure程序中使用了许多地图(maps)和结构体(structs)。除了性能以外,将它们转换为defrecords的好处是什么?
我在我的Clojure程序中使用了许多地图(maps)和结构体(structs)。除了性能以外,将它们转换为defrecords的好处是什么?
我认为结构体已经被有效地淘汰了,因此我根本不使用它们。
当我有一个在许多映射实例中使用的固定的众所周知的键集时,我通常创建一个记录。其主要好处是:
一些记录的缺点:
Stuart Sierra最近撰写了一篇有趣的文章,名为“用Clojure 1.2解决表达问题”,其中还包括一个有关defrecord
的部分:
我认为整篇文章都是理解协议和记录的良好起点。
另一个主要好处是记录具有类型(其类),您可以进行分派。
使用此功能的示例但并不代表所有可能的用法如下:
(defprotocol communicate
(verbalize [this]))
(defrecord Cat [hunger-level]
communicate
(verbalize [this]
(apply str (interpose " " (repeat hunger-level "meow")))))
(defrecord Dog [mood]
communicate
(verbalize [this]
(case mood
:happy "woof"
"arf")))
(verbalize (->Cat 3))
; => "meow meow meow"
(verbalize (->Dog :happy))
; => "woof"
在大多数情况下,使用map即可,只有需要多态时才使用记录。仅使用地图仍然可以使用多方法;但是,如果您想要协议,则需要记录。因此,在诉诸记录之前,请等待需要协议。在那之前,避免使用它们,而应优先考虑更加数据中心化和简单的代码。