Cuidado com as funções Ruby Numeric dentro de Enumerable.inject

Recentemente, li uma matriz em CSV, digamos [‘500’, ‘1000’, ’20’] por exemplo.
Eu precisava somar isso e não queria convertê-lo em um GSL :: Vector para fazer o somatório.
Então, mudei para o antigo método ruby ​​array.inject, da seguinte maneira:

a = ['500','1000','20'] 
Total = a.inject(:+)
=> "5001000020"

Não era isso que eu esperava. Principalmente porque esqueci de converter os dados do meu arquivo em ints ou floats reais.
Eu tinha feito isso primeiro:

a = ['500','1000','20'] 
a
.map!{|v| v.to_f}
Total = a.inject(:+)
=> 1520.0

Agora sim 🙂

Injetar é incrível, mas se você estiver codificando até as 3 da manhã, poderá acabar com um número ENORME na função estatística que está escrevendo.

http://ruby-doc.org/core-2.0.0/Enumerable.html#method-i-inject
http://ruby-doc.org/core-2.0.0/String.html#method-i-2B

Em uma nota relacionada! Evite todos os problemas ao fazer com que seu arquivo seja lido corretamente em primeiro lugar:

CSV.read("data/my.csv",
{:headers => "event_time,some_number,name,duration,count,rate,tags,title",
:header_converters => :symbol,
:converters => :all})

E sim, essa mágica :allparece ser muito inteligente na conversão de tipos nas coisas certas, mas certifique-se e verifique antes de confiar nela.

http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV.html#method-i-converters