2017-07-18 66 views
1

我已经定义了记录来存储用户详细信息和地址详细信息。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字段没有更新,它仍然显示旧值。

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

回答

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" 
+2

@ user1702169这项工作。但最有可能的是,您需要构建您的程序以避免依赖原子,并直接将新记录传递到您需要的地方。 – nha

0

这被称为不变性,是我喜欢clojure这么多的主要原因之一。

要理解的理由,为什么这种行为是如此有益,读书values and state真的帮了我

相关问题