为什么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"}
请说明为什么会这样。我怎么能避免这种情况呢?
答案 0 :(得分:3)
之所以发生这种情况,是因为您将两个变量都设置为指向相同的哈希值。编辑一个会编辑所有3个变量(包括@@ def),因为它们都是相同的哈希值。
避免这种情况的最简单方法是clone
哈希。
@var2 = @@def.clone
@var1 = @@def.clone
答案 1 :(得分:1)
因为@var1
和@var2
是对同一对象的引用。
如果您希望它们维护单独的值,则需要复制 @@def
。