Clojure:更新记录字段的值
我已定义记录以存储用户详细信息和地址详细信息Clojure:更新记录字段的值,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") 输出: #asy
(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"}}
#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"}}
(usr)
输出:
#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"}}
#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(用户…)
是不可变的。你不能改变它。
当您执行(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"
这就是所谓的不变性,也是我如此喜欢clojure的主要原因之一
为了理解为什么这种行为如此有益,阅读确实帮助了我这项工作。但最有可能的情况是,您需要构建程序以避免依赖atom,并在需要的地方直接传递新记录。