Atribuição por desestruturação
A atribuição por desestruturação é uma forma de extrair rapidamente valores de uma tabela por seu nome ou posição em tabelas baseadas em array.
Tipicamente, quando você vê um literal de tabela, {1,2,3}, ele está no lado direito de uma atribuição porque é um valor. A atribuição por desestruturação troca o papel do literal de tabela e o coloca no lado esquerdo de uma instrução de atribuição.
Isso é melhor explicado com exemplos. Assim você extrairia os dois primeiros valores de uma tabela:
thing = [1, 2]
[a, b] = thingprint a, bthing = [1, 2]
[a, b] = thingprint a, bNo literal de tabela de desestruturação, a chave representa a chave para ler do lado direito, e o valor representa o nome ao qual o valor lido será atribuído.
obj = { hello: "world" day: "tuesday" length: 20}
{hello: hello, day: the_day} = objprint hello, the_day
:day = obj -- OK fazer desestruturação simples sem chavesobj = { hello: "world" day: "tuesday" length: 20}
{hello: hello, day: the_day} = objprint hello, the_day
:day = obj -- OK fazer desestruturação simples sem chavesIsso também funciona com estruturas de dados aninhadas:
obj2 = { numbers: [1, 2, 3, 4] properties: { color: "green" height: 13.5 }}
{numbers: [first, second], properties: {color: color}} = obj2print first, second, colorobj2 = { numbers: [1, 2, 3, 4] properties: { color: "green" height: 13.5 }}
{numbers: [first, second], properties: {color: color}} = obj2print first, second, colorSe a instrução de desestruturação for complicada, sinta-se à vontade para espalhá-la em várias linhas. Um exemplo um pouco mais complicado:
{ numbers: [first, second] properties: { color: color }} = obj2{ numbers: [first, second] properties: { color: color }} = obj2É comum extrair valores de uma tabela e atribuí-los a variáveis locais que têm o mesmo nome da chave. Para evitar repetição, podemos usar o operador de prefixo ::
{:concat, :insert} = table{:concat, :insert} = tableIsso é efetivamente o mesmo que import, mas podemos renomear campos que queremos extrair misturando a sintaxe:
{:mix, :max, random: rand} = math{:mix, :max, random: rand} = mathVocê pode escrever valores padrão ao fazer desestruturação:
{:name = "sem nome", :job = "sem emprego"} = person{:name = "sem nome", :job = "sem emprego"} = personVocê pode usar _ como placeholder ao fazer desestruturação de lista:
[_, two, _, four] = items[_, two, _, four] = itemsDesestruturação por intervalo
Seção intitulada “Desestruturação por intervalo”Você pode usar o operador spread ... na desestruturação de lista para capturar um intervalo de valores. Isso é útil quando você quer extrair elementos específicos do início e do fim de uma lista enquanto coleta o restante entre eles.
orders = ["first", "second", "third", "fourth", "last"][first, ...bulk, last] = ordersprint first -- imprime: firstprint bulk -- imprime: {"second", "third", "fourth"}print last -- imprime: lastorders = ["first", "second", "third", "fourth", "last"][first, ...bulk, last] = ordersprint first -- imprime: firstprint bulk -- imprime: {"second", "third", "fourth"}print last -- imprime: lastO operador spread pode ser usado em diferentes posições para capturar diferentes intervalos, e você pode usar _ como placeholder para os valores que não quer capturar:
-- Capturar tudo após o primeiro elemento[first, ...rest] = orders
-- Capturar tudo antes do último elemento[...start, last] = orders
-- Capturar tudo exceto os elementos do meio[first, ..._, last] = orders-- Capturar tudo após o primeiro elemento[first, ...rest] = orders
-- Capturar tudo antes do último elemento[...start, last] = orders
-- Capturar tudo exceto os elementos do meio[first, ..._, last] = ordersDesestruturação em outros lugares
Seção intitulada “Desestruturação em outros lugares”A desestruturação também pode aparecer em lugares onde uma atribuição ocorre implicitamente. Um exemplo disso é um loop for:
tuples = [ ["hello", "world"] ["egg", "head"]]
for [left, right] in *tuples print left, righttuples = [ ["hello", "world"] ["egg", "head"]]
for [left, right] in *tuples print left, rightSabemos que cada elemento na tabela array é uma tupla de dois itens, então podemos desempacotá-lo diretamente na cláusula de nomes da instrução for usando desestruturação.