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