Somando valores de um array em ruby de uma forma mais elegante utilizando inject
Criado em: 16/02/2013
Imagine que tenhamos que somar os valores de um array
, provavelmente seguiríamos para uma abordagem neste sentido:
values = [1, 2, 3, 5, 8]
total = 0
values.each do |value|
total += value
end
puts total # => 19
No entanto o ruby possui o Enumerable#inject. Poderiamos trocar o nosso exemplo para algo como:
values = [1, 2, 3, 5, 8]
puts values.inject(:+) # => 19
uma versão bem mais simples e elegante do que o primeiro exemplo. O inject
ainda nos dá a possibilidade de definirmos um valor para iniciarmos o somatório.
values = [1, 2, 3, 5, 8]
puts values.inject(10, :+) # => 29
Perceba que agora iniciamos a contagem em 10 e adicionamos os demais valores.
Por padrão o valor que é iniciado no inject
é nil
, sendo assim se passarmos um array vázio o nosso retorno será nil
e não 0, que pode ser o esperado:
values = []
puts values.inject(:+) # => nil
Como vimos que podemos definir o valor inicial, podemos definir como 0 e assim conseguir o resultado que esperamos.
values = []
puts values.inject(0, :+) # => 0
Para quem estiver utilizando o rails, o ActiveSupport
adiciona no Enumerable
o método sum
que pode ser utilizado assim:
values = [1, 2, 3, 5, 8]
puts values.sum # => 19
No nosso exemplo utilizamos o array
values criado manualmente, mas poderia muito bem ser um array
criado a partir do uso do pluck do ActiveRecord por exemplo.
Comentários
Comentários powered by Disqus