Citando Joy of Clojure, sezione 4.3.1--Perché utilizzando le parole chiave o simboli come funzioni di ricercare i valori dalle mappe funzionano?
perché le parole chiave sono auto-valutazione e di fornire controlli di uguaglianza veloci, sono quasi sempre utilizzati nel contesto delle chiavi della mappa. Una ragione altrettanto importante utilizzare parole chiave come chiavi mappa è che possono essere utilizzati come funzioni, prendendo una mappa come argomento, per eseguire ricerche di valore:
(def population {:zombies 2700, :humans 9})
(:zombies population)
;=> 2700
(println (/ (:zombies population)
(:humans population))
"zombies per capita")
; 300 zombies per capita
Non è evidente per me che cosa sta succedendo Qui. In qualche modo (:zombies population)
deve ottenere trasformato in (get population :zombies)
, giusto? Come funziona esattamente? La parola chiave valuta a sé stessa, non a una funzione. Ha il lettore guardare fuori per i casi in cui la prima cosa in una lista è una parola chiave, e aggiungere ottenere e spostare la parola chiave alla fine della lista?
È interessante notare che il primo argomento non deve essere una mappa: (: foo: bar: baz) i rendimenti: baz – KingCode
@KingCode Se non si tratta di una 'ILookup', un java' Mappa ', o' IPersistentSet', quindi 'getFrom' in' RT' restituisce semplicemente 'null', nel qual caso il metodo' invoke' in 'Keyword' restituisce semplicemente il valore' notFound', o ': baz' nell'esempio . – Josh