Clave de mapa de Clojure con espacios en el nombre de la clave

Soy bastante nuevo en Clojure. Tengo un mapa de resultados de una base de datos y contiene valores clave como:

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

Quiero recuperar los valores del mapa, pero tengo problemas para obtener la identificación única del producto.

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

El nombre del producto funciona bien usando:

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

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

Muchas Gracias

preguntado el 01 de julio de 12 a las 15:07

3 Respuestas

Pruebe (palabra clave "ID de producto único")

Respondido 01 Jul 12, 16:07

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

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

Larga discusión aquí:

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

clojuredocs se actualizó con nuevas cadenas de documentos después de esa discusión, consulte aquí:

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

Respondido 05 Jul 12, 00:07

Oh, es bueno saberlo. dev.clojure.org/jira/browse/CLJ-17 sugiere que en algún momento en el futuro "soporte de símbolo arbitrario" podría implementarse, pero no puedo encontrar un ticket relevante. - Andrew Cooke

Puedes usar (keyword) como indica Jeff, pero creo que, en general, estaría mejor si transformara el mapa que obtiene de la consulta de la base de datos en uno cuyas claves no tengan espacios. Encuentro esta función útil para el propósito:

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

Luego use guiones bajos en lugar de los espacios:

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

Respondido 01 Feb 17, 22:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.