Карта неупорядочена (если вы явно не создали sorted-map
). Когда вы получаете записи на карте (такие как for
loop или first
), Clojure беззвучно вызывает seq
на карте, чтобы получить «список-подобную» последовательность MapEntry
элементов:
(def mappy {:c 3 :d 4 :a 1 :b 2 })
mappy => {:c 3, :d 4, :a 1, :b 2}
(seq mappy) => ([:c 3] [:d 4] [:a 1] [:b 2])
(vec mappy) => [[:c 3] [:d 4] [:a 1] [:b 2]]
(first mappy) => [:c 3]
Обратите внимание, что seq
печатается как список, но это не так. MapEntry печатает как вектор, но не печатает.
(seq mappy) => <#clojure.lang.PersistentArrayMap$Seq ([:c 3] [:d 4] [:a 1] [:b 2])>
(first mappy) => <#clojure.lang.MapEntry [:c 3]>
Если у вас есть какой-то последовательный объект (вектор, список или последовательность), вы можете использовать nth
, чтобы получать элементы по одному:
(let [mapseq (seq mappy)
mapvec (vec mappy) ]
(nth mapseq 3) => [:b 2]
(nth mapvec 3) => [:b 2]
Однако обратите внимание, что возвращаемый элемент все еще является MapEntry
, а не 2-вектором.
(nth mapseq 3) => <#clojure.lang.MapEntry [:b 2]>
(nth mapvec 3) => <#clojure.lang.MapEntry [:b 2]>
Вы можете получить ключ и значение из MapEntry, используя функции key
и val
:
(key (nth mapseq 3)) => :b
(val (nth mapvec 3)) => 2
P.S. Вы можете напечатать значение и его тип, как указано выше , используя функцию spyxx
.