我已定义记录以存储用户详细信息和地址详细信息。
(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
字段的新值尚未更新,但仍显示旧值。
如何在“用户”记录中永久更新“名称”字段?
答案 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确实帮助了我