Разрушение — это функциональность в Clojure, которая позволяет извлекать значения из структуры данных, такой как вектор, и связывать их с символами без необходимости явного обхода структуры данных.
Давайте рассмотрим пример того, что именно означает разрушение и как это происходит.
пример
(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)
Вышеуказанная программа производит следующий вывод.
Выход
1 2 3 4
В приведенном выше примере следует отметить следующее:
-
Мы определяем вектор целых чисел как 1, 2, 3 и 4.
-
Затем мы используем оператор let для непосредственного присвоения 4 переменных (a, b, c и d) переменной my-vector.
-
Если мы запустим оператор println для четырех переменных, мы увидим, что они уже были присвоены значениям в векторе соответственно.
Мы определяем вектор целых чисел как 1, 2, 3 и 4.
Затем мы используем оператор let для непосредственного присвоения 4 переменных (a, b, c и d) переменной my-vector.
Если мы запустим оператор println для четырех переменных, мы увидим, что они уже были присвоены значениям в векторе соответственно.
Таким образом, clojure деструктурировал переменную my-vector, которая имеет четыре значения, когда она была назначена с помощью оператора let. Затем четыре деконструированных значения были назначены четырем параметрам соответственно.
Если есть избыточные переменные, которые не имеют соответствующего значения, которому они могут быть назначены, тогда им будет присвоено значение nil. Следующий пример проясняет этот момент.
пример
(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)
Вышеуказанная программа производит следующий вывод. Из выходных данных видно, что, поскольку последняя переменная ‘e’ не имеет соответствующего значения в векторе, она равна нулю.
Выход
1 2 3 4 nil
остальные
Переменная ‘the-rest’ используется для хранения оставшихся значений, которые не могут быть присвоены какой-либо переменной.
Пример того, как это используется, показан в следующей программе.
пример
(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)
Вышеуказанная программа производит следующий вывод. Из выходных данных вы можете ясно видеть, что значения 3 и 4 не могут быть назначены какой-либо переменной, поэтому они присваиваются переменной ‘the-rest’.
Выход
1 2 (3 4)
Карты разрушения
Карты, как и векторы, также могут быть деструктурированы. Ниже приведен пример того, как это можно сделать.
пример
(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)
Вышеуказанная программа производит следующий вывод. Из программы вы можете ясно видеть, что значения карты «a» и «b» присваиваются переменным a и b.
Выход
1 2
Точно так же в случае векторов, если на карте нет соответствующего значения, когда происходит деструктуризация, переменной будет присвоено значение nil.
Ниже приведен пример.
пример
(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)
Вышеуказанная программа производит следующий вывод.