Clojure - Destrukturierung
Destructuring ist eine Funktionalität in Clojure, mit der man Werte aus einer Datenstruktur wie einem Vektor extrahieren und an Symbole binden kann, ohne die Datenstruktur explizit durchlaufen zu müssen.
Schauen wir uns ein Beispiel an, was genau Destrukturierung bedeutet und wie dies geschieht.
Beispiel
(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)
Das obige Programm erzeugt die folgende Ausgabe.
Ausgabe
1 2 3 4
Im obigen Beispiel sind folgende Dinge zu beachten:
Wir definieren einen Vektor von ganzen Zahlen als 1, 2, 3 und 4.
Wir benutzen dann die ‘let’ Anweisung zum direkten Zuweisen von 4 Variablen (a, b, c und d) zur my-vector-Variablen.
Wenn wir das laufen lassen ‘println’ Aussage zu den vier Variablen können wir sehen, dass sie bereits den Werten im Vektor zugeordnet wurden.
Daher hat clojure die Variable my-vector zerstört, die vier Werte hat, als sie mit der Anweisung 'let' zugewiesen wurde. Die dekonstruierten vier Werte wurden dann den vier Parametern entsprechend zugeordnet.
Wenn es überschüssige Variablen gibt, die keinen entsprechenden Wert haben, dem sie zugewiesen werden können, wird ihnen der Wert Null zugewiesen. Das folgende Beispiel macht diesen Punkt deutlich.
Beispiel
(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)
Das obige Programm erzeugt die folgende Ausgabe. Sie können der Ausgabe entnehmen, dass die letzte Variable 'e', da sie keinen entsprechenden Wert im Vektor hat, Null ausmacht.
Ausgabe
1 2 3 4 nil
der Rest
Die Variable 'the-rest' wird verwendet, um die verbleibenden Werte zu speichern, die keiner Variablen zugewiesen werden können.
Ein Beispiel für die Verwendung wird im folgenden Programm gezeigt.
Beispiel
(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)
Das obige Programm erzeugt die folgende Ausgabe. An der Ausgabe können Sie deutlich erkennen, dass die Werte 3 und 4 keiner Variablen zugewiesen werden können, sodass sie der Variablen 'the-rest' zugewiesen werden.
Ausgabe
1 2 (3 4)
Karten zerstören
Karten können ebenso wie Vektoren zerstört werden. Das Folgende ist ein Beispiel dafür, wie dies erreicht werden kann.
Beispiel
(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)
Das obige Programm erzeugt die folgende Ausgabe. Aus dem Programm können Sie deutlich erkennen, dass die Kartenwerte von „a“ und „b“ den Variablen von a und b zugeordnet sind.
Ausgabe
1 2
In ähnlicher Weise wird der Variablen im Fall von Vektoren ein Wert von Null zugewiesen, wenn bei der Destrukturierung kein entsprechender Wert in der Karte vorhanden ist.
Es folgt ein Beispiel.
Beispiel
(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)
Das obige Programm erzeugt die folgende Ausgabe.
Ausgabe
1 2 nil