Destructuring - Map et defn

En Clojure, vous pouvez aussi destructurer des maps.

Dans le premier exemple, on voit que l'on peut déstructurer une map en définissant via la syntaxe {name1 key1 name2 key2}. Dans cet exemple, les variables f1, f2, et f3 auront comme valeur les clés correspondantes.

Il est possible de faire la même chose de façon plus concise via le mot clé :keys, qui suivi d'un vector permet de récupérer les variables associées à ces clés. Attention, le nom de la variable doit être identique à la clé sous forme de keyword. Par exemple s1 pour une clé nommée :s1.
Il existe d'autres mot clé de ce type, comme :strs qui fonctionne de la même manière mais pour des clés de type string. Vous pouvez trouver plus de détails à ce propos dans la documentation officielle.

Comme pour les vectors, :as permet de récupérer la valeur complète d'une map déstructurée. Vous pouvez bien sûr également utiliser le destructuring sur des maps imbriquées.

Chose très intéressante, le mot clé :or permet lui de définir des valeurs par défaut si la clé est absente de la map.

Et les fonctions ?

Le destructuring ne s'utilise pas que dans les clauses let. Vous pouvez aussi l'utiliser dans les paramètres de fonctions !

C'est d'ailleurs comme cela que vous pouvez écrire des fonctions prenant en paramètre un nombre indéfini d'éléments (en déstructurant le vector des paramètres).

Conclusion

Le destructuring est un outil très puissant. Vous pouvez combiner toutes les façons que nous avons vu pour destructurer des structures de données ensemble pour accéder à leur contenu de façon concise.

Précédent - Suivant -

;; map destructuring
(let [{f1 :f1 f2 :f2 f3 :f3} {:f1 1 :f2 2 :f3 3}]
  (println "f :" f1 f2 f3 "\n"))

;; you can use :keys to have a more concise syntax
(let [{:keys [s1 s2 s3 s4]} {:s1 100 :s2 200 :s3 300}]
  (println "s :" s1 s2 s3 s4 "\n"))

;; you can use :as to get the full value
(let [{b1 :b1 :as bmap} {:b1 "b1value" :b2 "b2value"}]
  (println "b :" b1 bmap "\n"))

;; again, you can destructure nested maps
(let [{{:keys [t1 t2]} :z} {:z {:t1 "t1value" :t2 "t2value"}}]
  (println "t :" t1 t2 "\n"))

;; you can use :or to set default value of a key does not exists
(let [{a1 :a1 a2 :a2 :or {a1 "default-value"}} {:a2 "a2"}]
  (println "a :" a1 a2 "\n"))

;; destructuring works on function arguments!
(defn say-hello
  [{:keys [first-name last-name]}]
  (str "Hello " first-name " " last-name))

(println (say-hello {:first-name "Mark" :last-name "\"The Shark\" Shelton"}))

Powered by mcorbin - Available on Github