Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure:更新记录字段的值_Clojure - Fatal编程技术网

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,并在需要的地方直接传递新记录。