簡體   English   中英

為什么(關聯一切……)不能改變一切?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM