Clojure - niszczenie

Destructuring to funkcjonalność Clojure, która pozwala wyodrębnić wartości ze struktury danych, takiej jak wektor, i powiązać je z symbolami bez konieczności jawnego przechodzenia przez strukturę danych.

Spójrzmy na przykład, co dokładnie oznacza Destrukturyzacja i jak to się dzieje.

Przykład

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

Powyższy program generuje następujące dane wyjściowe.

Wynik

1 2 3 4

W powyższym przykładzie należy zwrócić uwagę na:

  • Definiujemy wektor liczb całkowitych jako 1, 2, 3 i 4.

  • Następnie używamy ‘let’ instrukcja, aby przypisać 4 zmienne (a, b, c i d) bezpośrednio do zmiennej my-vector.

  • Jeśli uruchomimy ‘println’ na czterech zmiennych możemy zobaczyć, że zostały one już przypisane odpowiednio do wartości w wektorze.

Więc clojure zniszczył zmienną my-vector, która ma cztery wartości, gdy została przypisana za pomocą instrukcji „let”. Zdekonstruowane cztery wartości zostały następnie odpowiednio przypisane do czterech parametrów.

Jeśli istnieją nadmiarowe zmienne, które nie mają odpowiedniej wartości, do której można je przypisać, wówczas zostanie im przypisana wartość nil. Poniższy przykład wyjaśnia tę kwestię.

Przykład

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

Powyższy program generuje następujące dane wyjściowe. Z wyniku widać, że skoro ostatnia zmienna „e” nie ma odpowiadającej wartości w wektorze, odpowiada zeru.

Wynik

1 2 3 4 nil

reszta

Zmienna „the-rest” służy do przechowywania pozostałych wartości, których nie można przypisać do żadnej zmiennej.

Przykład tego, jak jest używany, pokazano w poniższym programie.

Przykład

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

Powyższy program generuje następujące dane wyjściowe. Z wyników widać wyraźnie, że wartości 3 i 4 nie mogą być przypisane do żadnej zmiennej, więc są przypisywane do zmiennej „reszta”.

Wynik

1 2 (3 4)

Mapy zniszczenia

Podobnie jak wektory, mapy również mogą zostać zniszczone. Poniżej znajduje się przykład tego, jak można to osiągnąć.

Przykład

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

Powyższy program generuje następujące dane wyjściowe. Z programu jasno widać, że wartości map „a” i „b” są przypisane do zmiennych a i b.

Wynik

1 2

Podobnie w przypadku wektorów, jeśli nie ma odpowiadającej im wartości na mapie, kiedy nastąpi destrukturyzacja, wówczas zmiennej zostanie przypisana wartość zero.

Oto przykład.

Przykład

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

Powyższy program generuje następujące dane wyjściowe.

Wynik

1 2 nil