类变量被覆盖



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

Hash.new 的参数用作默认值,在您的例子中为 {}。

每次访问未知键都会使用完全相同的对象(Ruby 不会神奇地为你欺骗它),所以在你的例子中,每个键的值都是完全相同的哈希值。你可以用块形式完成我认为你想要的

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

在这种情况下,每个缺少的键使用不同的空哈希。

相关内容

  • 没有找到相关文章

最新更新