2015-07-21 1 views
0

Как я понимаю, ключевое слово let локально связывает переменные со значениями (поддерживая какое-то соответствие шаблонов). Он получает два аргумента. Сначала это вектор с символом, который мы хотим связать, и значением, которое мы хотим связать. Затем появляется выражение, которое использует это значение.Уничтожение карты (с использованием ключевого слова let)

В этом примере первая переменная person определяется:

user=> (def person {:name "Jabba" :profession "Gangster"}) 
#'user/person 

теперь предположим, что мы хотим уничтожить карту с помощью let функции:

user=> (let [{name :name} person] (str "The person's name is " name)) 
"The person's name is Jabba" 

Почему это в [{name :name} person], :name должен обязательно появляться после переменной name? Это фактически не сработало бы:

user=> (let [{:name name} person] (str "The person's name is " name)) 
"The person's name is " 

Почему такой порядок? Я думал, что карты могут быть определены в любом порядке:

user=> (def map1 {:a 1}) 
#'user/map1 
user=> (def map2 {1 :a}) 
#'user/map2 
+0

возможно дубликат [ярлыки Clojure для карт уничтожения того] (http://stackoverflow.com/questions/31220308/clojure-shortcuts-for-destructuring-maps) – schaueho

+0

'map1' и' map2' далеки от того, что: в 'map1', ключ': a', тогда как в последнем ключ - «1». В противном случае ваш вопрос будет выглядеть как дубликат https://stackoverflow.com/questions/31220308/clojure-shortcuts-for-destructuring-maps – schaueho

ответ

1

Я думал, что карты могут быть определены в любом порядке:

user=> (def map1 {:a 1}) 
#'user/map1 
user=> (def map2 {1 :a}) 
#'user/map2 

No.

map1 имеет один элемент ; с ключом :a и значением 1.
map2 имеет один элемент; с ключом 1 и значением :a.

Это не то же самое.

1
  1. на карте, порядок ввода значений ОЧЕНЬ ВАЖНО; первый парень - ключ, второй - значение.
  2. , если вам не нравится повторять себя, вы можете использовать ниже синтаксис для destructure одну или несколько записей в карте:

    (let [{:keys [name profession]} person] (str "The person's name is " name ", and job is " profession))