2017-07-18 71 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真的幫了我