Clojure - Destructuring
Destructuring é uma funcionalidade do Clojure, que permite extrair valores de uma estrutura de dados, como um vetor, e vinculá-los a símbolos sem ter que atravessar explicitamente a estrutura de dados.
Vejamos um exemplo do que exatamente significa desestruturação e como isso acontece.
Exemplo
(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)
O programa acima produz a seguinte saída.
Resultado
1 2 3 4
No exemplo acima, as seguintes coisas devem ser observadas -
Estamos definindo um vetor de inteiros como 1, 2, 3 e 4.
Estamos então usando o ‘let’ para atribuir 4 variáveis (a, b, c e d) à variável my-vetor diretamente.
Se executarmos o ‘println’ declaração nas quatro variáveis, podemos ver que elas já foram atribuídas aos valores no vetor, respectivamente.
Portanto, o clojure desestruturou a variável my-vector, que tinha quatro valores quando foi atribuída usando a instrução 'let'. Os quatro valores desconstruídos foram então atribuídos aos quatro parâmetros em conformidade.
Se houver variáveis em excesso que não tenham um valor correspondente ao qual possam ser atribuídas, elas receberão o valor nulo. O exemplo a seguir esclarece esse ponto.
Exemplo
(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)
O programa acima produz a seguinte saída. Você pode ver na saída que, como a última variável 'e' não tem um valor correspondente no vetor, ela é nula.
Resultado
1 2 3 4 nil
o resto
A variável 'the-rest' é usada para armazenar os valores restantes, que não podem ser atribuídos a nenhuma variável.
Um exemplo de como isso é usado é mostrado no programa a seguir.
Exemplo
(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)
O programa acima produz a seguinte saída. Na saída, você pode ver claramente que os valores de 3 e 4 não podem ser atribuídos a nenhuma variável, portanto, eles são atribuídos à variável 'o resto'.
Resultado
1 2 (3 4)
Mapas de Destruição
Assim como os vetores, os mapas também podem ser desestruturados. A seguir está um exemplo de como isso pode ser feito.
Exemplo
(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)
O programa acima produz a seguinte saída. No programa, você pode ver claramente que os valores do mapa de “a” e “b” são atribuídos às variáveis de a e b.
Resultado
1 2
Da mesma forma, no caso de vetores, se não houver um valor correspondente no mapa quando a desestruturação ocorrer, então a variável receberá um valor nulo.
A seguir está um exemplo.
Exemplo
(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)
O programa acima produz a seguinte saída.
Resultado
1 2 nil