Destructuring

, clojure, fp

Destructuring é uma das features mais legais do Clojure, permitindo mapear valores individuais de um vetor ou mapa para variáveis, deixando seu código mais legível e conciso.

O exemplo mais simples é mapear valores de um vetor para variáveis independentes:

No exemplo acima estamos mapeameando todos os valores do vetor passado, mas é possível ignorar alguns valores e pegar só os valores que você deseja:

Caso queira ignorar um valor em uma posição específica, nomeie a variável com _, uma convenção adotada na maioria dos casos:

Quando criamos funções recursivas é muito comum precisarmos separar um vetor em head e tail. Utilizando destructuring a tarefa se torna muito simples:

Se você precisar acessar o vetor com todos os elementos, basta usar a diretiva :as. Um bind será feito para o vetor:

Podemos usar destructuring com mapas, o que muda é que agora será necessário passar a key, além do local name:

Nada impede que você criei os locals usando o mesmo nome das keys:

Mas perceba que é meio redundante declarar locals com os mesmos nomes das keys. Pra evitar essa repetição, podemos utilizar a diretiva :keys que permite você passar as keys que você quer disponível:

Em muitos casos não temos certeza que o mapa passado como parâmetro terá as chaves que esperamos, podendo nos causar dores de cabeça, lidando com valores nil. O normal nestes casos é atribuir um valor default, programando defensivamente:

O interessante ao usar destructuring com mapas, é que podemos extrair valores nested, ou seja, valores de mapas dentro de mapas:

Você pode ver mais detalhes sobre o uso de destructuring na documentação.

Por último, gostaria de ressaltar que você pode usar destructuring para fazer binding dentro do let, como foi feitos nos exemplos, e também em funções.

Comentários: