2016-12-07 2 views
1

Я знаю, что если я определяю команду как:Изменение значения в списке векторов

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

я могу изменить значение «B» до «E» по

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

Если я теперь есть:

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

Как бы я изменить "B" до "1", например

Я думал, что вам, возможно, придется использовать ассоциативный интерфейс, но это, похоже, не работает, или, может быть, я допустил ошибку. Я попробовал

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

ответ

4

У вас его почти не было. Вы используете список, когда вы должны использовать вектор, чтобы делать то, что вы хотите сделать:

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

Причина этого заключается в том, что вектор является ассоциативной структурой (то есть, это структура с ключом/значение). Это похоже на карту, которая ассоциативна, за исключением того, что для вектора ключ является индексом в векторе. Сравните это со списком, который не может быть проиндексирован, и должен быть повторен для получения элемента. Таким образом, для использования связывать -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, ... 
Смежные вопросы