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 # => 19No entanto o ruby possui o Enumerable#inject. Poderiamos trocar o nosso exemplo para algo como:
values = [1, 2, 3, 5, 8]
puts values.inject(:+) # => 19uma 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, :+) # => 29Perceba 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(:+) # => nilComo vimos que podemos definir o valor inicial, podemos definir como 0 e assim conseguir o resultado que esperamos.
values = []
puts values.inject(0, :+) # => 0Para 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 # => 19No 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