2012-07-01 12 views
7

Sono abbastanza nuovo di Clojure. Ho una mappa dei risultati da un database e contiene i valori chiave quali:Clojure map key con spazi nel nome della chiave

{:Unique Product ID "09876" :ProductName "XYZ"} 

voglio recuperare i valori della mappa, ma sto avendo problemi a trovare l'ID prodotto unico.

ProductID (str (map-name ":Unique Product ID")) 

Nome del prodotto funziona bene con:

ProductName (str (map-name :ProductName")) 

io non sono sicuro di come gestire lo spazio in chiave campo ID prodotto. Come dovrei recuperare il valore per quella chiave dalla mappa?

Grazie

risposta

14

Prova (parola chiave "Unique ID prodotto")

+0

Grazie Jeff - che ha funzionato! Molto apprezzato!! – user1494355

7

Lo spazio è non un carattere valido in una parola chiave, che si stanno cercando di fare qualcosa che quasi certamente causare dolore in futuro.

Si noti che la funzione di parola chiave non convalida il suo input, quindi @ jeff-johnston non è corretto, ho paura.

lunga discussione qui:

https://groups.google.com/d/topic/clojure/WvXYkvLoQhI/discussion

clojuredocs è stato aggiornato con nuove docstrings seguenti quella discussione vedere qui:

http://clojuredocs.org/clojure_core/clojure.core/keyword

+0

oh, questo è bello sapere. http://dev.clojure.org/jira/browse/CLJ-17 suggerisce che in futuro potrebbe essere implementato "un supporto arbitrario di simboli" *, ma non riesco a trovare un ticket pertinente. –

0

È possibile utilizzare (keyword) come Jeff indica, ma penso starebbe meglio in generale se trasformassi la mappa che torni dalla query del database in una le cui chiavi non hanno spazi. Trovo questa funzione utile allo scopo:

(defn despace [m] 
    (zipmap (map #(keyword (clojure.string/replace (name %) " " "_")) (keys m)) 
      (vals m))) 

Quindi utilizzare sottolineatura al posto degli spazi:

(:Unique_Product_ID (despace {(keyword "Unique Product ID") "09876" :ProductName "XYZ"})) 
#=> "09876" 
Problemi correlati