1

我有一个用 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]}

问题:有没有更好的方法来编写 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 回答