Clojure - Desestructuración
Destructuring es una funcionalidad dentro de Clojure, que permite extraer valores de una estructura de datos, como un vector, y vincularlos a símbolos sin tener que atravesar explícitamente la estructura de datos.
Veamos un ejemplo de lo que significa exactamente Desestructurar y cómo ocurre.
Ejemplo
(ns clojure.examples.example
(:gen-class))
(defn Example []
(def my-vector [1 2 3 4])
(let [[a b c d] my-vector]
(println a b c d)))
(Example)
El programa anterior produce la siguiente salida.
Salida
1 2 3 4
En el ejemplo anterior, se deben tener en cuenta las siguientes cosas:
Estamos definiendo un vector de números enteros como 1, 2, 3 y 4.
Entonces estamos usando el ‘let’ instrucción para asignar 4 variables (a, b, cyd) a la variable my-vector directamente.
Si ejecutamos el ‘println’ declaración sobre las cuatro variables, podemos ver que ya se han asignado a los valores en el vector respectivamente.
Entonces clojure ha desestructurado la variable my-vector que tiene cuatro valores cuando se asignó usando la declaración 'let'. Los cuatro valores deconstruidos se asignaron a los cuatro parámetros en consecuencia.
Si hay un exceso de variables que no tienen un valor correspondiente al que puedan asignarse, entonces se les asignará el valor de cero. El siguiente ejemplo aclara este punto.
Ejemplo
(ns clojure.examples.hello
(:gen-class))
(defn Example []
(def my-vector [1 2 3 4])
(let [[a b c d e] my-vector]
(println a b c d e)))
(Example)
El programa anterior produce la siguiente salida. Puede ver en la salida que, dado que la última variable 'e' no tiene un valor correspondiente en el vector, cuenta como cero.
Salida
1 2 3 4 nil
el resto
La variable 'el resto' se usa para almacenar los valores restantes, que no se pueden asignar a ninguna variable.
En el siguiente programa se muestra un ejemplo de cómo se usa.
Ejemplo
(ns clojure.examples.example
(:gen-class))
(defn Example []
(def my-vector [1 2 3 4])
(let [[a b & the-rest] my-vector]
(println a b the-rest)))
(Example)
El programa anterior produce la siguiente salida. En la salida, puede ver claramente que los valores de 3 y 4 no se pueden asignar a ninguna variable, por lo que se asignan a la variable 'el resto'.
Salida
1 2 (3 4)
Desestructuración de mapas
Al igual que los vectores, los mapas también se pueden desestructurar. A continuación se muestra un ejemplo de cómo se puede lograr esto.
Ejemplo
(ns clojure.examples.example
(:gen-class))
(defn Example []
(def my-map {"a" 1 "b" 2})
(let [{a "a" b "b"} my-map]
(println a b)))
(Example)
El programa anterior produce la siguiente salida. Desde el programa se puede ver claramente que los valores del mapa de “a” y “b” están asignados a las variables de ay b.
Salida
1 2
De manera similar, en el caso de los vectores, si no hay un valor correspondiente en el mapa cuando ocurre la desestructuración, entonces a la variable se le asignará un valor de cero.
A continuación se muestra un ejemplo.
Ejemplo
(ns clojure.examples.example
(:gen-class))
(defn Example []
(def my-map {"a" 1 "b" 2})
(let [{a "a" b "b" c "c"} my-map]
(println a b c)))
(Example)
El programa anterior produce la siguiente salida.
Salida
1 2 nil