Clojure - Разрушение
Destructuring - это функция в 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’ оператор для четырех переменных, мы видим, что они уже были присвоены значениям в векторе соответственно.
Итак, 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 не могут быть присвоены какой-либо переменной, поэтому они назначаются переменной «остальное».
Вывод
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)
Вышеупомянутая программа производит следующий вывод.
Вывод
1 2 nil