为什么将哈希集更新为变量更新该变量?

ted*_*ear 2 ruby

我可以将哈希集更新为另一个变量,如下所示:

d = a = {b: 'c'}

a[:b] = 'qwerty'
d # => {:b=>'qwerty'} # What is this magic?

d[:b] = 'blah'
a # => {:b=>'blah'} # And this magic?
Run Code Online (Sandbox Code Playgroud)

为什么在使用原始变量时不会发生这种情况?

d = a = 'b'

a = 'c'
d # =>'b' # Why is it still the same?
Run Code Online (Sandbox Code Playgroud)

mu *_*ort 5

你做了两件截然不同的事情.

你的"原始变量"例子:

a = 'b'
d = a
a = 'c'
Run Code Online (Sandbox Code Playgroud)

是一个简单的赋值,以便在第2行的末尾,ad引用相同的对象.然后在第3行,a分配一个新对象,ad最终引用不同的对象.

你的第一个例子:

a = {b: 'c'}
d = a
a[:b] = 'qwerty'
Run Code Online (Sandbox Code Playgroud)

是一个赋值,然后调用一个方法来改变它的接收器.第三行也可以写为以下之一,使方法调用更加明确:

a.[]=(:b, 'qwerty')
a.send(:[]=, :b, 'qwerty')
Run Code Online (Sandbox Code Playgroud)

因此,您将通过变异方法调用的赋值与一系列赋值进行比较.

如果您的第二个示例使用了mutator方法a:

a = 'b'
# => 'b'
d = a
# => 'b'
a[0] = 'c' # String#[]= alters its receiver
# => 'c'
d
# => 'c'
Run Code Online (Sandbox Code Playgroud)

那么这两个ad,因为你没有做的任务来改变该对象会发生变化a是指,你改变引用的对象.


这个问题与Ruby是通过引用还是通过值传递并不完全相同,接近但不完全.我确信这是其他几个问题的重复,但我现在找不到它们.如果有人找到了正确的副本,请告诉我,我会删除它并拔出我的笨锤.