我正在研究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
答案 0 :(得分:3)
变量不是对象,变异对象不会改变对象是什么。也就是说,变异对象永远不会改变哪些变量评估到该对象。
两种方法的区别在于slice!
会改变原始字符串/对象(ick!)而slice
会返回一个新的字符串/对象,而不会改变原始字符串/对象耶!)。
以下X
表示特定(但任意)字符串,Y
表示不同的特定(但任意)字符串。不要将X
和Y
与变量混淆;它们只代表不同的对象来解释行为。
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