我有两个变量,一个(b
)引用另一个(a
)。当我使用方法修改a
时,b
也会被修改:
a = "TEXT"
b = a
print b
#=> TEXT
a.downcase!
print b
#=> text
但是,当我直接修改a
时,b
会保留其值:
a = "TEXT"
b = a
print b
#=> TEXT
a = "Something Else"
print b
#=> TEXT
为什么b
的行为在最初引用的变量被直接修改而不是方法时会有所不同?
在Ruby中这是不正确的事情,如果是这样,那么将一个变量引用另一个变量会有什么更好的做法?
答案 0 :(得分:4)
Ruby使用引用,你在那里犯了一个小错误。
这:
a.downcase!
作为' bang'方法建议,正在更改a
引用的值。
所以a
仍然是引用同一个对象,它只是被小写改变了!方法
但是这个:
a = "Something Else"
实际上是在告诉a
引用一个碰巧也是字符串的新对象。
由于b
引用了另一个对象并且该对象没有更改,因此仍然会打印TEXT。
答案 1 :(得分:3)
您可以使用object_id查看此处发生的情况。
a = "text"
a.object_id
=> 70200807828580
b = a
b.object_id
=> 70200807828580 # b points to the same object that a does.
a = "new"
a.object_id
=> 70200807766420 # a now points to a new object
b.object_id
=> 70200807828580 # b still points to the original object.
所以你看到变量实际上并不存储对象本身。相反,它存储对象的id。这就是为什么如果你复制一个对象,你通常只是复制它的id而不是创建一个全新的对象。