Является ли [{:keys [:a]}] или [{:keys [a]}] более идиоматическим разрушением?

#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 вау, не знал об этой «функции». Теперь я понимаю. Спасибо.