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.

RSpec: Crie especificações executáveis em Ruby
Aprimore as suas habilidades enquanto escreve testes com o meu livro RSpec: Crie especificações executáveis em Ruby

Comentários

Comentários powered by Disqus