1

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

(1) 到 (6) 下面用我的源代码描述。

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

非常感谢您提前。

源代码

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
4

1 回答 1

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
于 2013-02-09T23:06:34.673 回答