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