2012-09-20 16 views
6

¿Hay alguna forma de desestructurar un par de valores clave? Tengo una función que toma un mapa como parámetro, me gustaría extraer el valor de la clave y el valor en los params. Cómo puedo hacer eso ?cómo desestructurar un mapa como clave y valor

que puede hacer lo siguiente con un vector -

((fn [[ab]] (str ab)) [ab])

¿Cómo hago la misma/parecidos con mapa -

((fn [{kv}] (kv str)) {kv})

Gracias, Murtaza

+0

No sé de qué está hablando Ankur, pero prueba esto http://stackoverflow.com/questions/12505603/how-to-destructure-a-map-as-key-and-value/12505893#12505893 – runexec

Respuesta

16

mapa desestructuración en funciones arg listas está diseñado para extraer ciertas claves de un mapa y dándoles nombres de esta manera:

core> (defn foo [{my-a :a my-b :b}] {my-a my-b}) 
core/foo                      
core> (foo {:a 1 :b 2}) 
{1 2} 

Recomiendo this tutorial. Es un poco difícil dar un equivalente directo a ((fn[{k v}] (str k v)) {k v}) porque el mapa podría tener muchas claves y muchos valores, por lo que el código de desestructuración no podría decir qué clave y qué valor buscaba. La desestructuración por clave es más fácil de razonar.

Si desea elegir arbitrariamente la primera entrada en el mapa se puede extraer y utilizar el formulario de lista de desestructuración en un solo mapa de entrada:

core> (defn foo [[k v]] {v k}) 
#'core/foo                      
core> (foo (first {1 2})) 
{2 1} 

en este ejemplo el formulario de lista de desestructuración [k v] se utiliza porque primero devuelve la primera entrada del mapa como un vector.

+0

También es idiomático y conveniente asignar automáticamente los valores del mapa a los símbolos correspondientes a los nombres de las teclas. Esto se escribe así: '(defn foo [{: keys [a b]}] (str a b))'. Luego, en la llamada de función: '(foo {: a 1: b 2})'. Esto devolverá '" 12 "'. –

+0

El segundo ejemplo es realmente útil al procesar todos los pares clave/valor en un mapa, ya que la vista secuencial de un mapa es una lista de pares clave/valor. P.ej. (map (fn [[kv]] (println kv)) my-map) – Alex

-3
user=> (for [x (hash-map :a 1 :b 2 :c 3)] (str (first x) " " (second x))) 
(":a 1" ":c 3" ":b 2") 
+0

La pregunta es sobre 'des-estructurar un mapa' no sobre' concat primeros 2 elementos de un conjunto' – Ankur

+0

Su ejemplo anterior funcionó con mi código. ¿Puedes mostrarme que no? – runexec

+0

El código de muestra es solo un ejemplo de un mapa con 1 par de valores clave, ¿qué pasa con el mapa pasado tiene 5 pares clave/valor, cómo lo maneja su código? Ejemplo: mapa {: nombre "superhombre": 1000 años: trabajo "superhéroe"}, ahora tenemos que desestructurar las tres claves y su valor ... NOTA: desestructurar no extraer manualmente – Ankur

2

Hay atajos disponibles para desestructurar los mapas. Por ejemplo, si está buscando claves específicas, entonces no tiene que escribir nombre1: clave1 nombre1: clave2 ...

p.

main=> (defn fbb [{:keys [foo bar baz]}] (+ foo bar baz)) 
#'main/fbb 
main=> (fbb {:foo 2 :bar 3 :baz 4}) 
9 

en lugar de ...

(defn fbb [{foo :foo bar :bar baz :baz}] (+ foo bar baz)) 

Si las llaves son cadenas mapa, se puede decir :strs en lugar de :keys y si son símbolos que puede utilizar :syms.

Cuestiones relacionadas