Biến số newarray
của bạn được đặt tên kỳ quặc, vì trong Ruby và hầu hết các ngôn ngữ khác, mảng được lập chỉ mục theo số nguyên, không phải các đối tượng ngẫu nhiên như Class
. Có nhiều khả năng đây là Hash
.
Ngoài ra, bạn nên sử dụng c.class
, thay vì c.type
, không được dùng nữa.
Cuối cùng, vì bạn đang tạo một Hash
, bạn có thể sử dụng inject
như vậy:
newarray = array.inject({}) do |h,c|
h[c.class] = h.key?(c.class) ? h[c.class]+1 : 0
h
end
Hoặc, đối với một lớp lót:
newarray = array.inject({}) { |h,c| h[c.class] = h.key?(c.class) ? h[c.class]+1 : 0 ; h }
Như bạn có thể thấy, điều này mang lại kết quả mong muốn:
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}
Dấu hỏi thứ hai phải là dấu hai chấm. – jonas054