1

defrecordで定義されたデータ型があります。これには2つのベクトルが含まれています。

(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]}

質問:そのmutate-mytypeメソッドを書くためのより良い方法はありますか?

4

1 に答える 1

6

あなたの実装は完全に素晴らしいです。

いくつかの選択肢があります。たとえばassoc-in->スレッド演算子の使用を検討する場合があります。

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

この場合、これは実際にはアプローチに勝る利点はありませんが、より深いネストが行われている場合は、コードが読みやすくなる可能性があります。

于 2012-08-15T04:27:40.600 に答える