哈希合并行为



这种行为正确吗?我正在运行一些代码,如下所示:

@a_hash = {:a => 1}
x = @a_hash
x.merge!({:b => 2})

最后,x的值正如预期的那样发生了变化,但@a_ahash的值也发生了变化。我得到{:a=>1,:b=>2}作为它们的值。这在Ruby中是正常行为吗?

是的,实例变量@a_hash和局部变量x引用存储到同一个Hash实例,当您更改此实例时(使用原位更改对象的赋值函数方法merge!),这些变量将被求值为相同的值。

您可能希望使用merge方法来创建对象的副本,而不更改原始副本:

@a_hash = {:a => 1}
x = @a_hash
y = x.merge({:b => 2})
# y => {:a => 1, :b => 2}
# x and @a_hash => {:a => 1}

@a_ahash是x的链接。因此,如果您希望@a_aHash不被更改,您应该这样做:

@a_hash = {:a => 1}
x = @a_hash.clone
x.merge!({:b => 2})

是的,这是ruby(和大多数其他语言)中的正常行为。x@a_hash都是对同一对象的引用。通过调用merge!,您可以更改该对象,并且该更改通过引用它的所有变量可见

如果您不想要这种行为,则不应该使用变异方法(即使用x = x.merge(...)),或者在变异对象之前复制对象(即x = @a_hash.dup)。

相关内容

  • 没有找到相关文章

最新更新