Ruby变量引用其他变量

时间:2014-06-30 01:28:12

标签: ruby variables object reference

我有两个变量,一个(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中这是不正确的事情,如果是这样,那么将一个变量引用另一个变量会有什么更好的做法?

2 个答案:

答案 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而不是创建一个全新的对象。