【发布时间】:2014-07-30 06:21:22
【问题描述】:
我想知道普通变量和集合之间有什么区别。这是一个普通变量的示例。
a = "something"
b = a
a = "else"
p b # => "something"
据我所知,b 持有与a 相同对象的引用,即字符串(对象)"something"。因此,当a 发生变化时,它的值也会发生变化。或者更具体地说,当引用的对象发生变化时。为什么此行为与以下数组示例不同?
string = "hello"
array = [string]
p array # => ["hello"]
string = "something else"
p array # => ["hello"]
关闭,因为我认为该数组不包含变量 a,而是从 a 接管引用并转储包含引用的变量 (a)。所以当a 改变时,它对数组没有影响,因为它没有改变底层变量。
这是怎么回事?
更新 为了更清楚我的意思:
a = 'hello'
array = [a]
p a.object_id # 2168500580
p array[0].object_id # 2168500580
好的,这意味着指针a 和array[0] 指向内存中的同一个对象。我的想法是指针array[0] 是指针a,就像字面上一样,不是副本或其他东西。因此,当我更改 a 时,它会随处更改。就像我写a.upcase! 一样。但是当我只写a.upcase! 时,就像a 和array[0] 不再是同一个指针了。
【问题讨论】:
-
这很简单。如果第一个例子对你来说很清楚,那将回答你现在的第二个困惑。 :-)
-
在您的第一个示例中,
p b将打印"something"而不是"else"。 -
我没有投反对票,而是投了赞成票。所写的内容无法复制。在第一块代码的末尾,
b返回"something"。 -
谢谢 Uri Agassi 和 @sawa 哦,伙计,你是对的,对此感到抱歉,我刚刚更正了。这个问题是在火车上写在手机上的,估计在那儿写这样的问题并不完美。
标签: ruby arrays collections reference