2012-08-15 30 views
1

更新多個矢量我有defrecord定義的數據類型,它包含兩個向量:Clojure的defrecord - 如何內

(defrecord MyType [a b]) 

(def mytype (->MyType [1 2 3] [4 5 6])) 

我想有一個功能更新載體和返回一個新的MyType。我能想到的唯一的辦法就是通過嵌套調用assoc命令:

(defn mutate-mytype [mytype x y] 
    (assoc mytype :a (assoc (:a mytype) x y) 
       :b (assoc (:b mytype) x y))) 

輸出示例:

user=> (mutate-mytype mytype 1 7) 
#user.MyType{:a [1 7 3], :b [4 7 6]} 

問:是否有更好的方法來編寫發生變異,MYTYPE方法?

回答

6

你的實現非常好。

有幾種選擇,例如,您可以考慮使用assoc-in->線程操作:

(defn mutate-mytype [mytype x y] 
    (-> mytype 
     (assoc-in [:a x] y) 
     (assoc-in [:b x] y))) 

這並沒有真正有過在這種情況下,你的方法有什麼優勢,但如果你有更多的深度嵌套回事它可能使代碼更易讀。

+0

我不知道你可以使用 - >那樣。我有點困惑,它是怎麼知道的:a和:b在內部調用中,但它很整潔,它就是這樣工作的。 – 2012-08-15 04:37:06

+2

@WesFreeman「它如何知道:a和:b是」?我不清楚你的意思是什麼。請記住,所有線程宏所做的擴展是'(assoc-in(assoc-in mytype [:a x] y)[:b x] y)' – 2012-08-15 12:23:13