Destructuring - Vector

Il arrive souvent que vous ayez besoin de récupérer des valeurs présentes dans des structures de données. Parfois, ces structures de données sont même imbriquées les unes dans les autres.De plus, si la valeur n'existe pas (comme par exemple si une clé est absente d'une map), vous voulez peut être obtenir une valeur par défaut.

Comme nous l'avons vu précédemment, la librairie standard de Clojure fournit un grand nombre de fonctions pour réaliser cela. Une autre technique est le destructuring, qui est présenté ici sur des vectors.

Le destructuring permet de facilement assigner à des variables des valeurs présentes dans une structure de données.

Prenons par exemple le code suivant:

(let [string-vec ["first-string" "second-string"]
      s1 (first string-vec)
      s2 (second string-vec)]
  (println s1 s2 "\n"))

Voici le code équivalent en destructuring:

(let [[s1 s2] ["first-string" "second-string"]]
  (println s1 s2 "\n"))

On remarque qu'en wrappant s1 et s2 dans un vector, et en lui assignant comme valeur le vector contenant les deux string, Clojure assignera automatiquement à s1 et s2 les deux premiers éléments du vectors.

De la même façon, il est possible d'assigner une partie des éléments d'un vector à des variables, et tout le reste du vector dans une autre variable. Par exemple, la syntaxe [n1 n2 & nrest] assignera à n1 et n2 les deux premiers éléments du vector, et nrest sera un vector contenant le reste des éléments.

Il est également possible d'assigner dans des variables des valeurs présentes dans des structures de données imbriquées. C'est ce qui est réalisé dans l'exemple numéro 3.

Le destructuring marche sur des vectors, mais plus généralement sur tout ce qui est indexé (list, set, string).

Enfin, le mot clé :as permet d'assigner à une variable la valeur complète étant déstructurée. Par exemple, dans

(let [[c1 c2 c3 :as full-string] "Hello world!"])

c1 vaudra H, c2 e, c3 l, et full string la chaîne complète Hello world!.

Dans la suite de ce tutoriel, je présenterais le destructuring sur les maps. Vous pouvez également consulter le guide de Clojure pour un tutoriel plus complet sur le destructuring.

Précédent - Suivant -

;; destructure a list/vector/sequence
(let [[s1 s2] ["first-string" "second-string"]]
  (println s1 s2 "\n"))

;; destructure the 2 first values and the rest
(let [[n1 n2 & nrest] [1 2 3 4 5]]
  (println n1 n2 nrest "\n"))

;; destructure nested arrays. p4 will be nil because the array size = 3
(let [[p1 [p2 p3] p4] [100 [200 300]]]
  (println p1 p2 p3 p4 "\n"))

;; use :as to get the full value
(let [[c1 c2 c3 :as full-string] "Hello world!"]
  (println "c :" c1 c2 c3 full-string "\n"))

Powered by mcorbin - Available on Github