Как получить последовательность ключей для каждой карты в списке карт в Clojure?

#map #clojure #key

#словарь #clojure #Клавиша

Вопрос:

Итак, у меня есть следующая попытка отобразить список карт, и я пытаюсь получить последовательность ключей, которую функция ‘keys’ возвращает просто отлично всякий раз, когда я передаю ей одну карту.

 (map #(keys %) ({:a-id 1 :b 3 :c 2} {:d-id 3 :e 9 :c 1} {:a-id 3 :d-id 5 :c 2}))
  

который возвращает мне

java.lang.ClassCastException: null

Я предполагаю, что это как-то связано с типом возврата ключей, являющимся последовательностью, и путем сопоставления, я предполагаю, что он ожидает возвращаемое значение карты??? Я действительно не уверен точно, почему он это делает, все, что я знаю, это то, что было бы чертовски удобно, если бы я мог заставить его выполнять в mapping то, что он делает для меня, когда я выполняю одно приложение

 (keys {:a-id 1 :b 3 :c 2})
  

что такое — (:a-id :b : c)

Ответ №1:

 (map keys '({:a-id 1 :b 3 :c 2} {:d-id 3 :e 9 :c 1} {:a-id 3 :d-id 5 :c 2}))
  

Ответ №2:

 ({:a-id 1 :b 3 :c 2} {:d-id 3 :e 9 :c 1} {:a-id 3 :d-id 5 :c 2})
  

Является ли вызов функции не списком. Вы должны использовать список или вектор или заключить выражение в кавычки:

 (list{:a-id 1 :b 3 :c 2} {:d-id 3 :e 9 :c 1} {:a-id 3 :d-id 5 :c 2})
  

Ответ №3:

Еще лучше просто не использовать списки, если вы действительно не хотите создать вызов функции. Ваш исходный код, преобразованный в вектор из 3 карт, отлично работает:

 user=> (map #(keys %) [{:a-id 1 :b 3 :c 2} {:d-id 3 :e 9 :c 1} {:a-id 3 :d-id 5 :c 2}] )
((:a-id :c :b) (:e :c :d-id) (:a-id :c :d-id))
  

Мы оставляем внешние круглые скобки на месте, поскольку (map …) предназначен для вызова функции. Мы меняем внутренний список на вектор, поскольку это подчеркивает, что это данные (в отличие от вызова функции). Цитирование списка также работает, но является излишне сложным. Это все равно что сказать: «Я выполняю вызов функции, но не оцениваю это как вызов функции».