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