覆盖哈希

时间:2012-10-22 14:56:17

标签: ruby

为什么ruby会覆盖类实例变量@var1

require 'pp'
class Foo
  @@def = { :key1 => "someval1", :key2 => "someval2" }
  def initialize
    @var1 = @var2 = @@def
    @var1[:key1] = "newval1"
    @var2[:key1] = "newval2"
    pp(@var1)
    pp(@var2)
  end
end
f = Foo.new

输出

{:key1=>"newval2", :key2=>"someval2"}
{:key1=>"newval2", :key2=>"someval2"}

请说明为什么会这样。我怎么能避免这种情况呢?

2 个答案:

答案 0 :(得分:3)

之所以发生这种情况,是因为您将两个变量都设置为指向相同的哈希值。编辑一个会编辑所有3个变量(包括@@ def),因为它们都是相同的哈希值。

避免这种情况的最简单方法是clone哈希。

@var2 = @@def.clone
@var1 = @@def.clone

答案 1 :(得分:1)

因为@var1@var2是对同一对象的引用。

如果您希望它们维护单独的值,则需要复制 @@def