2016-12-07 45 views
1

我知道,如果我定義團隊:在向量的列表更改值

(def team ["A" "B" "C" "D"]) 

我可以

(assoc team 1 "E") > ["A" "E" "C" "D"] 

更改值「B」到「E」如果我現在有:

(def teams '(["A" "B" "C"] ["D" "E" "F"] ["G" "H" "I"])) 

我怎麼會改變 「B」 爲 「1」,例如

我以爲你可能不得不使用assoc-in,但似乎沒有工作,或者我犯了一個錯誤。我試過

(assoc-in teams [0 1] "1") 

回答

4

你幾乎已經擁有它了。您正在使用一個列表中,當你應該使用矢量,做你想做的事:

(def teams [["A" "B" "C"] ["D" "E" "F"] ["G" "H" "I"]]) 

這樣做的原因是,一個向量是一個關聯結構(即,它是與主要的結構/值對)。它就像一張地圖,它是關聯的,除了矢量之外,關鍵是矢量中的索引。將它與一個不能編入索引的列表進行對比,並且必須迭代才能獲得一個元素。因此,要使用assoc -in,您需要使用關聯結構,而列表不會。

你得到的錯誤是:clojure.lang.PersistentList cannot be cast to clojure.lang.Associative,一看源表明這一點:

IPersistentList給出:

public interface IPersistentList extends Sequential, IPersistentStack 

對比度與AssociativeIPersistentVector

public interface IPersistentVector extends Associative, Sequential, ...