La variabile newarray
è denominata in modo strano, poiché in Ruby e nella maggior parte degli altri linguaggi, gli array sono indicizzati da numeri interi, non oggetti casuali come Class
. È più probabile che questo sia un Hash
.
Inoltre, si dovrebbe usare c.class
, anziché c.type
, che è deprecato.
Infine, dal momento che si sta creando un Hash
, è possibile utilizzare inject
in questo modo:
newarray = array.inject({}) do |h,c|
h[c.class] = h.key?(c.class) ? h[c.class]+1 : 0
h
end
Oppure, per un one-liner:
newarray = array.inject({}) { |h,c| h[c.class] = h.key?(c.class) ? h[c.class]+1 : 0 ; h }
Come si può vedere, questo dà i risultati desiderati:
irb(main):001:0> array = [1, {}, 42, [], Object.new(), [1, 2, 3]]
=> [1, {}, 42, [], #<Object:0x287030>, [1, 2, 3]]
irb(main):002:0> newarray = array.inject({}) { |h,c| h[c.class] = h.key?(c.class) ? h[c.class]+1 : 0 ; h }
=> {Object=>0, Hash=>0, Array=>1, Fixnum=>1}
Il secondo punto interrogativo deve essere due punti. – jonas054