Help us understand the problem. What is going on with this article?

merge で値も型も右側のhashmapを優先したい

More than 5 years have passed since last update.

merge は2つのhashmapを合併したhashmapを作る。
同じkeyがあると右側のhashmapの値が優先される。
optionをhashmapで取るようにしてデフォルト値と合わせるときに便利。
値は右側が優先されるが、型は左側が保存される。
これはdefrecordで作った型をmergeしたい時に問題になる。

(defrecord Person [a b])
(def person (Person. 1 1))
;=> #cljs.user.Person{:a 1, :b 1}

用意したhashmapとmergeしたいが、値も型もpersonの方を優先したい。

(merge person {:a 2 :c 2})
;=> #cljs.user.Person{:a 2, :b 1, :c 2} ;; 値は右側が優先され型はPersonのまま。
(merge {:a 2 :c 2} person)
;=> {:a 1, :c 2, :b 1}  ;; 値はpersonが優先されるが、型がPersonじゃなくなる。

workaround的な対処だがpersonで挟む。

(merge person {:a 2 :c 2} person)
;=> #cljs.user.Person{:a 1, :b 1, :c 2}
fatrow
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away