Map/Each
Esses dois métodos são bastante similares, ambos permitem que você execute uma ação para cada item de seu Array.
Vamos ver isso no código!
numeros = [1, 2, 3]
numeros.each{ |numero| puts(numero + 1) }
# 2
# 3
# 4
=> [1, 2, 3]
numeros.map{ |numero| numero + 1 }
=> [2, 3, 4]
A diferença é que o .map
retorna um novo Array, com os retornos de cada iteração, enquanto o .each
retorna o próprio objeto que foi iterado.
Select/Reject
O .select
permite que você selecione elementos de um Array conforme os critérios que estipular. Você precisa passar para ele, como parâmetro, uma função que retorne um boolean, assim ele retornará um Array com os elementos que resultarem em verdadeiro (true
).
animais = ['pato', 'gato', 'cachorro']
animais.select { |animal| animal.end_with? 'to' }
=> ['pato', 'gato']
O .reject
faz o contrário do .select
, assim, não vou prolongar muito a explicação pois seu funcionamento é bastante similar.
animais = ['pato', 'gato', 'cachorro']
animais.reject { |animal| animal.end_with? 'to' }
=> ['cachorro']
Reduce/Join
O .reduce
é o mais complexo entre esses métodos, porém ele é usado geralmente para executar tarefas simples, como contas matemáticas. Veja o exemplo:
numeros = [1, 2, 3, 4]
numeros.reduce{ |soma, numero| soma + numero }
=> 10
O .reduce
vai acumular os retornos das iterações em uma variável (no nosso exemplo, a soma
). Na primeira iteração, ele soma os dois primeiros elementos do Array, depois vai somar o próximo valor ao resultado e assim por diante. Ao final, retorna o valor de soma
.
O .join
é parecido com o .reduce
. Ele recebe um argumento, uma string
que vai ser inserida entre os elementos da lista e retorna uma longa string
com todos os elementos da lista separados pelo parâmetro passado:
vegetais = ['batata', 'couve', 'brócolis']
vegetais.join(' e ')
=> "batata e couve e brócolis"
É sempre interessante conhecer os diferentes métodos que o Ruby nos fornece. Eles podem poupar bastante dor de cabeça!