を使用して、次の結果の背後にある理由を誰かが説明できますか(assoc-in)
?
(assoc-in {:foo {:bar {:baz "hello"}}} [:foo :bar] "world")
=> {:foo {:bar "world"}}
(assoc-in {:foo {:bar nil}} [:foo :bar :baz] "world")
=> {:foo {:bar {:baz "world"}}}
(assoc-in {:foo {:bar "hello"}} [:foo :bar :baz] "world")
=> ClassCastException java.lang.String cannot be cast to clojure.lang.Associative clojure.lang.RT.assoc (RT.java:702)
どうやら、マップnil
を別のデータ型 (文字列など) に置き換えることもできますが、データ型 (文字列など) をマップに置き換えることはできません。データ型が既にマップである必要があるためです。
そして、これをどのように回避しますか?私は次のことを達成したいと思います:
(assoc-in {:foo {:bar "hello"}} [:foo :bar :baz] "world")
=> {:foo {:bar {:baz "world"}}}