Clojure:更新记录字段的值
问题描述:
我已经定义了记录来存储用户详细信息和地址详细信息。Clojure:更新记录字段的值
(defrecord User [id name address])
(defrecord Address [id location street city state])
(def usr (User. 1 "Abc"
(Address. 1 "Location 1" "Street" "NY" "US")))
我已经更新 “名称” 为 “BCD” 使用以下代码
(assoc usr :name "BCD")
输出:
#async_tea_party.core.User{:id 1, :name "BCD", :address #async_tea_party.core.Address{:id 1, :location "Location 1", :street "Street", :city "NY", :state "US"}}
(USR)
输出:
#async_tea_party.core.User{:id 1, :name "Abc", :address #async_tea_party.core.Address{:id 1, :location "Location 1", :street "Street", :city "NY", :state "US"}}
新值name
字段没有更新,它仍然显示旧值。
如何在“用户”记录中永久更新“名称”字段?
答
(def usr (User...))
是一种不可变的。你不能改变它。 当你做(assoc usr :name "BCD")
你没有改变它。你创建一个新的。为了做到你想要的东西,你需要一个原子。
(def usr (atom (User. 1 "Abc"
(Address. 1 "Location 1" "Street" "NY" "US"))))
(:name @usr) ;; "Abc"
(swap! usr assoc :name "BCD")
(:name @usr) ;; "BCD"
@ user1702169这项工作。但最有可能的是,您需要构建您的程序以避免依赖原子,并直接将新记录传递到您需要的地方。 – nha