类变量被覆盖

时间:2012-10-03 22:38:52

标签: ruby ruby-1.9.2

我使用哈希作为类变量遇到了一个奇怪的问题。运行以下代码后,我希望类变量@@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'

1 个答案:

答案 0 :(得分:4)

Hash.new的参数用作默认值,在您的情况下为{}。

对未知密钥的每次访问都使用完全相同的对象(r​​uby并不会为你神奇地复制它),因此在您的情况下,每个密钥的值都是完全相同的哈希值。您可以使用块表单

完成我认为您的意图
Hash.new {|hash, key| hash[key] ={} }

在这种情况下,每个丢失的密钥都使用不同的空哈希。