我应该在哪里使用 clojure 中的 defrecord? [英] Where should I use defrecord in clojure?

查看:13
本文介绍了我应该在哪里使用 clojure 中的 defrecord?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 clojure 程序中使用了许多映射和结构.将这些转换为取消记录有什么好处(除了性能)?

I use many maps and structs in my clojure programs. What are the benefits (apart from performance) of converting these to defrecords?

推荐答案

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

I consider structs to be effectively deprecated so I don't use them at all.

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

When I have a fixed set of well-known keys used in many map instances, I usually create a record. The big benefits are:

  • 性能
  • 生成的类有一个类型,我可以在多方法或其他情况下打开
  • 通过围绕 defrecord 的额外宏机制,我可以获得字段验证、默认值以及我想要的任何其他内容
  • 记录可以实现任意接口或协议(地图不能)
  • 记录作为大多数用途的地图
  • keys 和 vals 以稳定的(每次创建)顺序返回结果

记录的一些缺点:

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

这篇关于我应该在哪里使用 clojure 中的 defrecord?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆