0

ハッシュをクラス変数として使用すると、奇妙な問題が発生しました。次のコードを実行すると、クラス変数@@class_hash{:one => {'a' => 'one'}, :two => {'a' => 'two'}}.

ただし、このコードを実行すると@@class_hash{:one => {'a' => 'two'}, :two => {'a' => 'two'}}.

何故ですか?

class Klass
  @@class_hash = Hash.new({})

  def fun1
    @@class_hash[:one]['a'] = 'one'
  end

  def fun2
    @@class_hash[:two]['a'] = 'two'
  end

  def class_hash
    @@class_hash
  end
end

klass = Klass.new

klass.fun1
h1 = klass.class_hash
raise "h2[:one]['a'] should be 'one', not 'two'" if h1[:one]['a'] == 'two'
klass.fun2
h2 = klass.class_hash
raise "h2[:one]['a'] should be 'one', not 'two'" if h2[:one]['a'] == 'two'
4

1 に答える 1

4

Hash.newの引数がデフォルト値として使用され、この場合は{}です。

未知のキーへのすべてのアクセスは、まったく同じオブジェクトを使用します(rubyは魔法のようにそれを複製しているわけではありません)。したがって、あなたの場合、各キーの値はまったく同じハッシュです。あなたはブロックフォームであなたが意図したと思うことを達成することができます

Hash.new {|hash, key| hash[key] ={} }

この場合、欠落しているキーごとに異なる空のハッシュが使用されます。

于 2012-10-03T22:44:57.350 に答える