#clojure #destructuring
#clojure #разрушение
Вопрос:
В чем различия между двумя следующими формами?
(defn abc [{:keys [:a]}] a)
(defn abc [{:keys [a]}] a)
Есть ли более идиоматичный?
Комментарии:
1. Я бы сказал, что with symbols (второй пример) в основном единственный, который работает с
:syms
and:strs
(например(let [{:strs ["a"]} {"a" 1}] a)
, сбой)
Ответ №1:
Сопоставление деструктурирования с помощью :keys обычно выполняется с помощью символов, как в вашем втором примере.
Я не совсем уверен в этом утверждении, но я думаю, что поддержка ключевых слов в :keys была добавлена специально для поддержки случая деструктурирования ключевых слов в пространстве имен с псевдонимами пространства имен, то есть:
(ns (require [com.company.foo :as foo]
... ))
(defn abc [{:keys [::foo/a]}] a)
Комментарии:
1.
(let [{:keys [foo/a]} {:foo/a 1}] a) => 1
2. Обратите внимание, что :foo/a и ::foo/a — это не одно и то же. В моем случае foo — это псевдоним пространства имен. Я не знаю, изменилось ли это в более поздней версии clojure, но в прошлый раз, когда я проверял foo в:foo/a не проверяет псевдонимы (в :: it делает)
3. В 1.9 вы
(let [{:foo/keys [a]} #:foo{:a 1}] a) ;=> 1
также можете использовать синтаксис.4. @Setzer22 вау, не знал об этой «функции». Теперь я понимаю. Спасибо.