为什么(关联所有......)不会改变一切?

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].为什么?

Sha*_*nce 5

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)

请注意,由于结构共享,新的向量不是旧版本的完整副本,只有一个更改,而是一个小得多的新树,重用大部分旧向量.