A elegância do Ruby é frequentemente destacada por seus poderosos métodos de iteração. Dois destaques, each
e collect
(também conhecido como map
), são fundamentais para o processamento de coleções. Entender seus pontos fortes e como combiná-los melhora significativamente a eficiência e a legibilidade do código Ruby.
Sumário
- Entendendo o método
each
- Explorando o método
collect
(map
) - Combinando
each
ecollect
- Técnicas de Iteração Avançadas
- Conclusão
- FAQ
Entendendo o método each
O método each
é uma pedra angular da iteração em Ruby. Ele itera por cada elemento de um array, hash ou outro objeto enumerável, executando um bloco de código para cada um. Usado principalmente para efeitos colaterais — ações que modificam algo fora do escopo do método each
—, ele não transforma inerentemente a coleção original.
numbers = [1, 2, 3, 4, 5]
numbers.each do |number|
puts number * 2 # Imprime cada número multiplicado por 2
end
# Saída:
# 2
# 4
# 6
# 8
# 10
Aqui, each
itera, e o bloco imprime cada número duplicado. O array numbers
permanece inalterado.
Explorando o método collect
(map
)
Ao contrário de each
, collect
(ou map
— são aliases) transforma a coleção, retornando um novo array contendo os resultados da aplicação de um bloco a cada elemento. É perfeito para criar conjuntos de dados modificados.
numbers = [1, 2, 3, 4, 5]
squared_numbers = numbers.collect do |number|
number * number # Eleva cada número ao quadrado
end
puts squared_numbers # Imprime [1, 4, 9, 16, 25]
puts numbers # Imprime [1, 2, 3, 4, 5] - array original inalterado
collect
cria squared_numbers
; o array numbers
original permanece intacto.
Combinando each
e collect
O poder de each
e collect
realmente brilha quando usados juntos. Você pode usar each
para efeitos colaterais enquanto collect
transforma os dados.
numbers = [1, 2, 3, 4, 5]
squared_numbers = numbers.collect do |number|
puts "Processando: #{number}" # Efeito colateral
number * number
end
puts squared_numbers # Imprime [1, 4, 9, 16, 25]
Isso combina transformação e registro dentro do bloco collect
.
Técnicas de Iteração Avançadas
Além do uso básico, explore métodos como inject
/reduce
para agregações e transformações mais complexas. Esses oferecem abordagens alternativas para processar coleções, fornecendo flexibilidade além de operações elemento a elemento.
Conclusão
each
e collect
são essenciais para qualquer desenvolvedor Ruby. Entender seus usos, individualmente e combinados, melhora significativamente a clareza, eficiência e manutenibilidade do código. A escolha depende se você precisa modificar a coleção original ou simplesmente executar ações em cada elemento.
FAQ
- P: Qual a diferença entre
collect
emap
? R: São aliases; funcionalmente idênticos.map
é frequentemente preferido para legibilidade. - P:
each
pode retornar um valor? R:each
sempre retorna a coleção original. Seu propósito são os efeitos colaterais. - P: Posso usar
each
com hashes? R: Sim.my_hash.each { |key, value| puts "#{key}: #{value}" }
- P: Existem alternativas a
collect
? R: Sim,inject
/reduce
, mascollect
/map
permanece o mais direto para transformações elemento a elemento.