Clojure:更新记录字段的值

时间:2017-07-18 11:28:37

标签: 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")))

我已使用以下代码

将“name”更新为“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字段的新值尚未更新,但仍显示旧值。

如何在“用户”记录中永久更新“名称”字段?

2 个答案:

答案 0 :(得分:1)

(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"

答案 1 :(得分:0)

这就是所谓的不变性,也是我喜欢clojure的主要原因之一。

要理解为什么这种行为如此有益的原因,阅读values and state确实帮助了我