clojure - 我应该在 Clojure 中哪里使用 defrecord?

标签 clojure

我在 clojure 程序中使用了许多映射和结构。将这些转换为 defrecords 有什么好处(除了性能之外)?

最佳答案

我认为结构实际上已被弃用,因此我根本不使用它们。

当我在许多 map 实例中使用一组固定的众所周知的键时,我通常会创建一条记录。最大的好处是:

  • 性能
  • 生成的类具有我可以在多方法或其他情况下打开的类型
  • 通过 defrecord 周围的附加宏机制,我可以获得字段验证、默认值以及我想要的任何其他内容
  • 记录可以实现任意接口(interface)或协议(protocol)( map 不能)
  • 在大多数情况下,记录都可以充本地图
  • 键和值以稳定(每次创建)顺序返回结果

记录的一些缺点:

  • 因为记录是 Java 类实例(不是 Clojure 映射),所以不存在结构共享,因此相同的记录结构可能会比已更改的等效映射结构使用更多的内存。尽管 JVM 是专门为处理这种短暂的垃圾而设计的,但当您“更改”记录时,还会有更多的对象创建/销毁。
  • 如果您在开发过程中更改记录,您可能需要更频繁地重新启动 REPL 以获取这些更改。这通常只是开发过程中的一个小问题。
  • 许多现有库尚未更新以支持记录(postwalk、zip、ma​​tchure 等)。我们已根据需要添加了此支持。

关于clojure - 我应该在 Clojure 中哪里使用 defrecord?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4575170/

相关文章:

clojure - 排序嵌套映射 Clojure

vector - 如何访问向量向量中的特定元素 clojure

clojure - 将 var 或 #' 应用于 Clojure 中的函数列表

xml - 为什么 Clojure 将 xml 文档表示为 HashMap ?

map - 通过多个键使用Clojure更新

clojure - 在clojure中向 map 添加类型的最简单方法

jdbc - 来自sql数据库的日期时间结果在clojure jdbc中不相同

Clojure 序列和集合

clojure - 如何让 Clojure 在 REPL 启动时加载特定于项目的 .clj 文件?

clojure - Om Next 的 query->ast 和 ast->query 函数