Clojure - Destructuration
Destructuring est une fonctionnalité de Clojure, qui permet d'extraire des valeurs d'une structure de données, comme un vecteur, et de les lier à des symboles sans avoir à traverser explicitement la structure de données.
Regardons un exemple de ce que signifie exactement la destruction et comment cela se produit.
Exemple
(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)
Le programme ci-dessus produit la sortie suivante.
Production
1 2 3 4
Dans l'exemple ci-dessus, les choses suivantes doivent être notées -
Nous définissons un vecteur d'entiers comme 1, 2, 3 et 4.
Nous utilisons alors le ‘let’ instruction pour affecter directement 4 variables (a, b, c et d) à la variable my-vector.
Si nous exécutons le ‘println’ déclaration sur les quatre variables, nous pouvons voir qu'elles ont déjà été affectées respectivement aux valeurs du vecteur.
Donc clojure a déstructuré la variable my-vector qui a quatre valeurs lorsqu'elle a été assignée à l'aide de l'instruction 'let'. Les quatre valeurs déconstruites ont ensuite été attribuées aux quatre paramètres en conséquence.
S'il y a des variables en excès qui n'ont pas de valeur correspondante à laquelle elles peuvent être affectées, elles recevront la valeur nil. L'exemple suivant clarifie ce point.
Exemple
(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)
Le programme ci-dessus produit la sortie suivante. Vous pouvez voir à partir de la sortie que puisque la dernière variable 'e' n'a pas de valeur correspondante dans le vecteur, elle compte à zéro.
Production
1 2 3 4 nil
le reste
La variable 'the-rest' est utilisée pour stocker les valeurs restantes, qui ne peuvent être affectées à aucune variable.
Un exemple sur la façon dont cela est utilisé est montré dans le programme suivant.
Exemple
(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)
Le programme ci-dessus produit la sortie suivante. À partir de la sortie, vous pouvez clairement voir que les valeurs de 3 et 4 ne peuvent être affectées à aucune variable, elles sont donc affectées à la variable «the-rest».
Production
1 2 (3 4)
Cartes de destruction
Tout comme les vecteurs, les cartes peuvent également être déstructurées. Voici un exemple de la façon dont cela peut être accompli.
Exemple
(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)
Le programme ci-dessus produit la sortie suivante. Depuis le programme, vous pouvez clairement voir que les valeurs de carte de «a» et «b» sont affectées aux variables de a et b.
Production
1 2
De même dans le cas des vecteurs, s'il n'y a pas de valeur correspondante dans la carte lorsque la déstructuration se produit, alors la variable se verra attribuer une valeur nulle.
Voici un exemple.
Exemple
(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)
Le programme ci-dessus produit la sortie suivante.
Production
1 2 nil