defrecord包含一个递增的"vector"/"java类"



克罗地亚人:感谢您对这个问题的关注!

这是我正在考虑的情况,我想定义一个不可变的银行账户记录

(defrecord account [ name balance statements])
(def cash-account (->account :cash 0.0 []))

我有一个功能,可以将deposit的钱存入该账户,并且account的新记录将返回

(.deposit cash-account 100.0 )
;; returns a new cash-account with attributes 
;; name = :cash balance= 100, statment=[ [(2018,1,1),100 ] ]

随着越来越多的存取款发生,字段statement列表将随着内部越来越多的交易而扩展。

我的问题是:1000笔交易后,最新账户返回的statment字段中有1000个元素。

第1001笔交易发生时:

Clojure是否会在旧账户记录的statment字段中复制*1000笔交易,并附加新交易,将其保存到新账户记录中?

或者Clojure只是*append*将新事务添加到旧帐户记录并提供一个指向它的新指针,使其看起来像新帐户记录一样的持久映射?

感谢您的帮助&非常感谢

来源https://clojure.org/reference/datatypes#_deftype_and_defrecord:

  • defrecord提供了持久映射的完整实现
  • deftype支持可变字段,defrecord不支持

因此,在您的情况下,它不会复制事务,而是使用持久数据结构,因此看起来事务是被附加的

以下是您还应该检查的更多文档:

  • https://www.braveclojure.com/functional-programming/
  • https://clojure.org/guides/learn/sequential_colls
  • https://purelyfunctional.tv/guide/clojure-collections/
  • https://youtu.be/lJr6ot8jGQE

最新更新