0

为什么 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"}

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

4

2 回答 2

3

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

避免这种情况的最简单方法是clone散列。

@var2 = @@def.clone
@var1 = @@def.clone
于 2012-10-22T15:00:52.207 回答
1

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

如果您希望它们保持单独的值,您需要复制 @@def.

于 2012-10-22T14:58:27.987 回答