Clojure: возврат вектора из анонимной функции
Я написал небольшую анонимную функцию, которая будет использоваться с вызовом map
. Функция возвращает вектор, содержащий имя столбца и значение столбца из запроса набора результатов SQL.
Вот функция (input - имя столбца):
(fn [name] [(keyword name) (.getObject resultset name)])
Это прекрасно работает, однако, когда я пытался использовать "упрощенную" версию анонимной функции, я получил сообщение об ошибке:
#([(keyword %) (.getObject resultset %)])
java.lang.IllegalArgumentException: Wrong number of args (0) passed to: PersistentVector
Вот вызов map
:
(into {} (map (fn [name] [(keyword name) (.getObject resultset name)]) column-names))
Можно ли использовать упрощенный синтаксис для этой функции? Если да, то как?
Спасибо.
Ответы
Ответ 1
Ваша проблема в том, что простой синтаксис пытается оценить вектор как вызов функции.
Вы можете вставить функцию "identity", чтобы заставить ее работать, поскольку это просто простая функция, которая вернет вектор без изменений:
#(identity [(keyword %) (.getObject resultset %)])
Ответ 2
Для этого вам необходимо использовать вектор:
#(vector (keyword %) (.getObject resultset %))
P.S. существуют также функции для карт, множеств и т.д.
Ответ 3
Да, Clojure должен действительно поддерживать конструкцию # [...] только для этого случая.
В качестве лучшей альтернативы я бы рекомендовал следующее:
#(vector (keyword %) (.getObject resultset %))