1

object_id新しいオブジェクトがいつ作成されるかを知るために、Rubyでメソッドの動作を研究しています。(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

変数はオブジェクトではなく、オブジェクトを変更してもオブジェクトが何であるかは変わりません。つまり、オブジェクトを変更しても、そのオブジェクトに評価される変数は変更されません。

2つのメソッドの違いはslice!、元の文字列/オブジェクトを変更し(ick!)、元の文字列/オブジェクトを変更せずsliceに新しい文字列/オブジェクトを返すことです(yay!)。

以下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
于 2013-02-09T23:06:34.673 に答える