Votre variable newarray
est nommée bizarrement, puisque dans Ruby et dans la plupart des autres langages, les tableaux sont indexés par des entiers, pas des objets aléatoires comme Class
. Il est plus probable que ce soit un Hash
.
En outre, vous devez utiliser c.class
, au lieu de c.type
, qui est obsolète.
Enfin, puisque vous créez un Hash
, vous pouvez utiliser inject
comme ceci:
newarray = array.inject({}) do |h,c|
h[c.class] = h.key?(c.class) ? h[c.class]+1 : 0
h
end
Ou, pour une seule ligne:
newarray = array.inject({}) { |h,c| h[c.class] = h.key?(c.class) ? h[c.class]+1 : 0 ; h }
Comme vous pouvez le voir, cela donne les résultats souhaités:
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}
Le deuxième point d'interrogation doit être un deux-points. – jonas054