2016-10-07 5 views
0

В чем разница между двумя следующими формами?Есть ли [{: keys [: a]}] или [{: keys [a]}] более идиоматическое разрушение?

(defn abc [{:keys [:a]}] a) 
(defn abc [{:keys [a]}] a) 

Есть ли более идиоматический?

+2

Я бы утверждают, что с символами (второй пример) в основном является единственным, который работает с ': syms' и': strs' (например, '(let [{: strs [" a "]} {" a "1}] a) 'fail) – cfrick

ответ

1

Карта деструктурирования с помощью: ключей, которые мы обычно выполняем с символами, как в вашем втором примере.

Я не совсем уверен в этом пункте, но я думаю, что поддержка по ключевым словам в: ключи были добавлен специально для поддержки случая уничтожения того слова с пространствами имёны пространствами имен псевдонимов, то есть:

(ns (require [com.company.foo :as foo] 
      ...)) 

(defn abc [{:keys [::foo/a]}] a) 
+2

' (let [{: keys [foo/a]} {: foo/a 1}] a) => 1' – OlegTheCat

+2

Обратите внимание: foo/a и :: foo/a не совпадают. В моем случае foo является псевдонимом пространства имен. Я не знаю, изменилось ли это в более поздней версии clojure, но в прошлый раз я проверил foo: foo/a не проверяет псевдонимы (в :: он делает) – Setzer22

+2

В 1.9 вы можете использовать '(let [ {: foo/keys [a]} #: foo {: a 1}] a); => 1'. – madstap

 Смежные вопросы

  • Нет связанных вопросов^_^