Su variable newarray
se nombra de manera extraña, ya que en Ruby y en la mayoría de los demás idiomas, las matrices están indexadas por enteros, no por objetos aleatorios como Class
. Es más probable que este sea un Hash
.
Además, debe utilizar c.class
, en lugar de c.type
, que está en desuso.
Finalmente, puesto que se está creando un Hash
, puede utilizar inject
así:
newarray = array.inject({}) do |h,c|
h[c.class] = h.key?(c.class) ? h[c.class]+1 : 0
h
end
O, para una sola línea:
newarray = array.inject({}) { |h,c| h[c.class] = h.key?(c.class) ? h[c.class]+1 : 0 ; h }
Como se puede ver, esto da los resultados deseados:
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}
El segundo signo de interrogación debe ser dos puntos. – jonas054