Atribuição múltipla com Destruturing Assignment

Uma coisa que me chamou muita a atenção na linguagem Go foi a possibilidade de retornos múltiplos e, até mesmo, de tipos diferentes. Recentemente, vi que agora, na era pós ES6, podemos fazer algo parecido com JavaScript. Vamos supor que precisamos tratar um nome, e exibi-lo como referência do determinado autor. Poderíamos fazer assim: Mas
Atribuição múltipla com Destruturing Assignment

Uma coisa que me chamou muita a atenção na linguagem Go foi a possibilidade de retornos múltiplos e, até mesmo, de tipos diferentes. Recentemente, vi que agora, na era pós ES6, podemos fazer algo parecido com JavaScript.

Vamos supor que precisamos tratar um nome, e exibi-lo como referência do determinado autor. Poderíamos fazer assim:

Mas e se precisarmos de ambos os nomes separados? Poderíamos criar uma função para cada uma das ações, uma para pegar o ultimoNome, outra para pegar os outrosNomes· Isso resolve, certo? Veja só:

Apesar de modularizado e com funções que cumprem apenas uma tarefa, precisamos atribuir cada uma das variáveis ao seu respectivo valor de uma forma não tão interessante. Podemos ter um código final melhor, de leitura e entendimento, e menor. E é aqui que entramos no ponto chave deste artigo.

O que é “Destructuring Assignment”

Destructuring Assignment (ou atribuição por desestruturação) é uma sintaxe de expressão que permite extrair valores de arrays e objetos, usando o lado esquerdo da atribuição (left-hand side of assignment) para definir quais valores serão extraídos. Exemplos básicos:

Mas é claro que isso não é tudo. Então vamos lá, vamos ver alguns detalhes de cada um dos casos.

É um pouco óbvio, mas no próximo tópico você vai entender o porquê de eu ressaltar isso.

Vamos supor que temos uma função que nos retorna um array com os valores da cotação do dólar nos últimos 30 dias. Vamos supor também, que precisamos dos 5 primeiros valores. Podemos usar o Array.prototype.slice(), mas isso nos retornaria um novo array. Então se precisarmos das variáveis separadas, seria necessário atribuir uma a uma para as 5 primeiras posições do array.

A atribuição fica muito mais enxuta, consegue perceber? Percebeu que os outros 25 elementos não fazem diferença para a atribuição? Caso esses elementos sejam necessários, e for permitido colocá-los num array mesmo, podemos utilizar o operador rest …:

E se precisarmos, por exemplo, dos 7 primeiros elementos, com exceção do 4º e 6º elementos, isso quebraria a lógica, certo? ERRADO!!! É ainda mais simples. Para cada posição que for necessária saltar, só precisamos especificá-la com os espaços em branco separados por vírgula ( , ). Veja:

Em algum outro caso, se tivermos um array de retorno, com o tamanho instável e for necessário garantir determinada quantidade de valores, podemos deixar valores pré-definidos na atribuição:

Tudo certo? Ok, então vamos passar para o próximo caso.

Podemos também fazer a atribuição indireta, como no exemplo do array, mas aqui há uma particularidade (a que eu falei “você vai entender o porquê de eu ressaltar isso”). Se você tentar executar o código abaixo, terá um erro de sintaxe:

Isso porque { a, b } é considerado um bloco, então realmente há um erro de sintaxe aí. Para consertar isso, devemos colocar essa operação de atribuição dentro de uma expressão, entre parênteses:

Assim como na operação para array, podemos ter valores pré-definidos também:

E outra coisa legal também, é que podemos jogar os valores para uma variável com um novo nome:

Voltando ao primeiro exemplo deste artigo, aquele do nome do autor, podemos reescrevê-lo assim:

Pronto! Já temos os dois valores que queríamos e podemos trabalhar com eles da forma que for necessária.

Conclusão

Essas novas características de destructuring assignment funcionam mais como um syntax sugar, mas realmente chegam a ser úteis. O mais legal é que você pode usá-las em conjunto e adotar a solução que seu problema pedir.

Espero ter ajudado. Caso não tenha entendido alguma parte deste artigo, e dos códigos, comente abaixo, ou me mande um tweet. É sempre um prazer.

Até a próxima

(:

Referências

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *