Destructuring
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: