如何切片和切片!影响Ruby中的object_id?

时间:2013-02-09 23:03:55

标签: ruby

我正在研究Ruby中的object_id方法行为,以便知道何时创建新对象。我可以理解(1)与(2)相同,(3)与(4)相同。但我不明白为什么(5)与(6)不相同。

下面用我的源代码描述

(1)upto(6)。

所以我想了解Ruby中object_id何时被更改(新分配)。有人简明扼要地解释了吗?

非常感谢你。

源代码

a = "foo"
b = a
b.slice!(0)

p a.object_id # (1)
p b.object_id # (2)

b = b

p a.object_id # (3)
p b.object_id # (4)

b = b.slice(0)

p a.object_id # (5)
p b.object_id # (6)

结果

70302398954840                                                                                                                                                                                      
70302398954840
70302398954840
70302398954840
70302398954840
70302398954680

1 个答案:

答案 0 :(得分:3)

变量不是对象,变异对象不会改变对象是什么。也就是说,变异对象永远不会改变哪些变量评估到该对象。

两种方法的区别在于slice!会改变原始字符串/对象(ick!)而slice会返回一个新的字符串/对象,而不会改变原始字符串/对象耶!)。

以下X表示特定(但任意)字符串,Y表示不同的特定(但任意)字符串。不要将XY与变量混淆;它们只代表不同的对象来解释行为。

a = X                # a = X
b = a                # b = a -> b = X, so b = X
b.slice!(0)          # MUTATE object X

p a.object_id # (1)  # a = X
p b.object_id # (2)  # b = X

b = b                # b = b -> b = X, so b = X (no effect)

p a.object_id # (3)  # a = X
p b.object_id # (4)  # b = X

b = b.slice(0)       # b = f(b), where NEW object (Y) is returned, so b = Y

p a.object_id # (5)  # a = X
p b.object_id # (6)  # b = Y