-8

次のコードがあります。

class A 
end

class B 
end

a1 = A.new
a2 = A.new
b1 = B.new
b2 = B.new

array = [a1, a2, b1, b2]
hash = {}

array.each do |obj|
    if hash[obj.class] = nil
        hash[obj.class] = []
    else
        hash[obj.class] << obj
    end
end

ハッシュを等しくしたい

{ A => [a1,a2], B => [b1,b2] }

<<しかし、演算子を使用できないと言っています。

4

2 に答える 2

2

まとめましょう。

if hash[obj.class] = nil

↑ 条件が実行されるたびにペアをリセットしています。これは、そのゼロ性をテストする代わりに、に設定された一意の等しいためhash[obj.class]ですnil==代わりに使用してください。
それから、あなたはやっています

array.each do |obj|
  if hash[obj.class] == nil
    hash[obj.class] = []    # if nil, initialize to new array
  else                      # but because of the else, you are not...
    hash[obj.class] << obj  # doing this so you don't register the first object of each class.
  end
end

結論

array.each do |obj|
  hash[obj.class] ||= [] # set hash[obj.class] to [] if nil (or false)
  hash[obj.class] << obj
end
于 2013-07-09T02:48:02.677 に答える