2012-07-01 8 views
7

Soy bastante nuevo en Clojure. Tengo un mapa de los resultados de una base de datos y que contiene valores clave como:Clave del mapa Clojure con espacios en el nombre de la clave

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

Quiero recuperar los valores del mapa, pero estoy teniendo problemas para obtener el identificador de producto único.

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

Nombre del producto funciona bien usando:

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

no estoy seguro de cómo manejar el espacio en el campo ID de clave de producto. ¿Cómo debo recuperar el valor de esa clave del mapa?

Gracias

Respuesta

14

Try (palabra clave "Steam ID del producto")

+0

Gracias Jeff - que funcionó! ¡¡Muy apreciado!! – user1494355

7

espacio es no un carácter válido en una palabra clave, que están tratando de hacer algo que es casi seguro que causar dolor en el futuro.

Tenga en cuenta que la función de palabra clave no valida su entrada, por lo que @ jeff-johnston es incorrecta, me temo.

larga discusión aquí:

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

clojuredocs se ha actualizado con nuevos docstrings siguientes esa discusión ver aquí:

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

+0

oh, eso es bueno saberlo. http://dev.clojure.org/jira/browse/CLJ-17 sugiere que en algún momento en el futuro se pueda implementar el "soporte simbólico arbitrario" *, pero no puedo encontrar un ticket relevante. –

0

Usted puede utilizar (keyword) como Jeff indica, pero os piensan Sería mejor en general si transforma el mapa que obtiene de la consulta de la base de datos en uno cuyas claves no tienen espacios. Encuentro que esta función útil para este fin:

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

Entonces utilizar guiones en lugar de los espacios:

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