Clojure - Destrutturante

Destructuring è una funzionalità all'interno di Clojure, che consente di estrarre i valori da una struttura di dati, come un vettore e associarli a simboli senza dover attraversare esplicitamente la struttura di dati.

Diamo un'occhiata a un esempio di cosa significa esattamente Destructuring e di come avviene.

Esempio

(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)

Il programma precedente produce il seguente output.

Produzione

1 2 3 4

Nell'esempio sopra, devono essere annotate le seguenti cose:

  • Stiamo definendo un vettore di numeri interi come 1, 2, 3 e 4.

  • Stiamo quindi utilizzando il ‘let’ per assegnare direttamente 4 variabili (a, b, c e d) alla variabile my-vector.

  • Se eseguiamo il ‘println’ dichiarazione sulle quattro variabili, possiamo vedere che sono già state assegnate rispettivamente ai valori nel vettore.

Quindi clojure ha destrutturato la variabile my-vector che ha quattro valori quando è stata assegnata usando l'istruzione 'let'. I quattro valori decostruiti sono stati quindi assegnati ai quattro parametri di conseguenza.

Se ci sono variabili in eccesso che non hanno un valore corrispondente a cui possono essere assegnate, verrà assegnato loro il valore nil. Il seguente esempio chiarisce questo punto.

Esempio

(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)

Il programma precedente produce il seguente output. Puoi vedere dall'output che poiché l'ultima variabile 'e' non ha un valore corrispondente nel vettore, è pari a zero.

Produzione

1 2 3 4 nil

il riposo

La variabile "the-rest" viene utilizzata per memorizzare i valori rimanenti, che non possono essere assegnati a nessuna variabile.

Un esempio di come viene utilizzato è mostrato nel seguente programma.

Esempio

(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)

Il programma precedente produce il seguente output. Dall'output, puoi vedere chiaramente che i valori di 3 e 4 non possono essere assegnati a nessuna variabile, quindi sono assegnati alla variabile "the-rest".

Produzione

1 2 (3 4)

Mappe destrutturanti

Proprio come i vettori, anche le mappe possono essere destrutturate. Di seguito è riportato un esempio di come ciò può essere realizzato.

Esempio

(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)

Il programma precedente produce il seguente output. Dal programma è possibile vedere chiaramente che i valori della mappa di “a” e “b” sono assegnati alle variabili di a e b.

Produzione

1 2

Allo stesso modo nel caso dei vettori, se non c'è un valore corrispondente nella mappa quando avviene la destrutturazione, alla variabile verrà assegnato un valore nil.

Di seguito è riportato un esempio.

Esempio

(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)

Il programma precedente produce il seguente output.

Produzione

1 2 nil