0 clojure
(def everything (vec (repeat 5 (vec (repeat 5 [0 0 0])))))
(assoc-in everything [3 3] [255 255 255])
(get-in everything [3 3])
Run Code Online (Sandbox Code Playgroud)
这将返回[0 0 0],而不是[255 255 255].为什么?
Clojure数据结构是不可变的,因此assoc-in不会更改向量,但会返回带有更改的新向量.要产生任何影响,assoc-in必须在绑定中捕获结果,传递给函数等.
(get-in (assoc-in everything [3 3] [255 255 255]) [3 3])
;=> [255 255 255]
Run Code Online (Sandbox Code Playgroud)
请注意,由于结构共享,新的向量不是旧版本的完整副本,只有一个更改,而是一个小得多的新树,重用大部分旧向量.