我在我的clojure程序中使用了很多地图和结构。将这些转化为辩证的有什么好处(除了表现)?
答案 0 :(得分:87)
我认为结构有效地被弃用,所以我根本不使用它们。
当我在许多地图实例中使用一组固定的已知密钥时,我通常会创建一条记录。最大的好处是:
记录的一些缺点:
答案 1 :(得分:14)
defrecord
的一节:
http://www.ibm.com/developerworks/java/library/j-clojure-protocols/index.html#datatypes
我认为整篇文章是理解协议和记录的良好起点。
答案 2 :(得分:9)
另一个主要好处是记录有一个你可以派出的类型(它的类)。
使用此功能但不能代表所有可能用途的示例如下:
(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"
答案 3 :(得分:2)
在大多数情况下使用地图,仅在需要多态时才使用记录。仅使用地图,您仍然可以使用多方法;但是,如果您需要协议,则需要记录。鉴于此,请等到您需要协议才能使用记录。在此之前,请避免使用更多以数据为中心且更简单的代码。
答案 4 :(得分:0)
除了之前已经提到的内容之外,除了在性能方面通常处于同等或更高水平,并且在将相同的编程接口暴露为地图之外,记录还强制执行温和的结构:密钥名称和密钥数量在定义的时间。这可能有助于避免愚蠢错误,其中许多值需要相同的结构(否则只是人为刚性)。
无论原始动机是什么,这个属性也将它与地图区分开来。