Mesclando e Transformando
Parte da seção Lógica e Fluxo do Journey de Ruby da Coddy. Lição 36 de 56.
Duas operações surgem com tanta frequência ao trabalhar com hashes que o Ruby fornece a elas seus próprios métodos.
merge combina dois hashes em um novo. Quando ambos possuem a mesma chave, o valor da direita vence:
defaults = { color: "red", size: "M" }
custom = { size: "L" }
settings = defaults.merge(custom)
puts settings.inspect # {color: "red", size: "L"}Nenhum original é modificado, merge retorna um novo hash.
transform_values constrói um novo hash com as mesmas chaves, mas com cada valor passado por um bloco:
prices = { apple: 1, bread: 3 }
with_tax = prices.transform_values { |p| p * 1.2 }
puts with_tax.inspect # {apple: 1.2, bread: 3.6}E o transform_keys faz o mesmo para as chaves, sendo útil ao converter strings para símbolos ou normalizar a capitalização:
{ "a" => 1, "B" => 2 }.transform_keys(&:upcase)
# {"A"=>1, "B"=>2}Desafio
MédioSão fornecidos dois hashes de carrinho: monday e tuesday, cada um mapeia o nome de um item como string para uma quantidade inteira. A loja quer um total normalizado de dois dias.
Produza um único hash final:
- fazendo
mergedos dois hashes com um bloco, para que as chaves presentes em ambos tenham suas quantidades somadas (em vez de sobrescritas) - aplicando
transform_keys(&:to_sym)ao resultado, para que as chaves se tornem símbolos - usando
transform_valuespara aplicar um desconto de 10% por volume: cada quantidade se torna(qty * 9 / 10)usando aritmética inteira
Imprima o hash final com inspect.
Para os dados padrão, a saída é:
{:apples=>9, :bread=>4, :milk=>5, :cheese=>1}(Maçãs: 5 + 5 = 10, depois 9. Pão: 3 + 2 = 5, depois 4. Leite: 6 apenas na segunda-feira → 5. Queijo: 2 apenas na terça-feira → 1.)
Experimente você mesmo
monday = { "apples" => 5, "bread" => 3, "milk" => 6 }
tuesday = { "apples" => 5, "bread" => 2, "cheese" => 2 }
# TODO: merge-with-block para somar chaves sobrepostas, depois transformar chaves em símbolos,
# depois aplicar * 9 / 10 a cada valor, então inspecionar
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica e Fluxo
1Strings em Profundidade
Visão Geral dos Métodos de StringInterpolação de StringsPercorrendo StringsDividir e UnirRecapitulação - String Weaver4Blocos, Procs e Lambdas
O que é um Bloco?do..end vs ChavesA Palavra-chave yieldParâmetros de BlocoProcs e LambdasRevisão - Iterador Personalizado7Hashes - Parte 2
Hash.new com Valores PadrãoIterando sobre HashesHashes AninhadosMesclando e TransformandoRecapitulação - Contador de Frequência10Projeto - Registros de Alunos
Visão Geral do ProjetoAdicionar Aluno2Intervalos
O que é um intervalo?Métodos de intervaloIntervalos em Case / WhenRevisão - Prática com intervalos5Potência do Enumerable
Select e RejectEncadeando MapReduce / Injectcount, all?, any?, none?group_by e partitionsort_by, min_by, max_byRecapitulação - Pipeline de DadosPratique por conta própria: Compilador de Ruby online