[英]Why does (assoc-in everything …) not change everything?
(def everything (vec (repeat 5 (vec (repeat 5 [0 0 0])))))
(assoc-in everything [3 3] [255 255 255])
(get-in everything [3 3])
這將返回[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]
注意,由於結構共享, 新矢量不是僅具有一個更改的舊副本的完整副本,而是一棵小得多的新樹,重用了許多舊矢量。
向量是不可變的。 assoc-in
在應用於不可變數據結構時只會返回一個新的數據結構,而不會觸及原始數據結構。 您可能想給返回值一個新名稱,例如, (def foo (assoc-in everything [3 3] [255 255 255]))
,或者將其傳遞給其他函數或其他東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.