0

次のコード:

 test_1 = "my test string"
 test_2 = test_1
 test_2[3] = "B"
 puts test_1
 puts test_2

 test_1 = "my test string"
 test_2 = test_1
 test_2 = test_2 + ""
 test_2[3] = "B"
 puts test_1
 puts test_2

次の結果が生成されます。

 my Best string
 my Best string
 my test string
 my Best string

最初のケースでは両方の文字列が変更されているのに (test_2 が参照によって割り当てられているかのように)、2 番目のケースでは test_2 のみが変更されている理由を説明できますか (値によるかのように)。

4

2 に答える 2

3

Ruby で宣言する"test"と、新しい String オブジェクトが作成されます。

"test".object_id   # => 9157960
"test".class       # => String

文字列を変数に代入するときは、代入先の文字列オブジェクトを変数に指定します。

以下を見てください。

# Point variable to first String object.
a = "test"         # => "test"
a.object_id        # => 9307800

# Point variable to second String object.
b = "test"         # => "test"
b.object_id        # => 9307760
a.equal?(b)        # => false

# Point variable to first String object.
c = a              # => "test"
c.object_id        # => 9307800
a.equal?(c)        # => true

したがって、aここを操作するときは、指しているオブジェクトを操作しますc

于 2013-10-26T19:14:51.697 に答える
3

説明は次のとおりです。

test_1 = "my test string"
test_2 = test_1

test_2.object_id # => 83607730
test_1.object_id # => 83607730

test_2 = test_2 + ""

test_2.object_id # => 83606390
test_1.object_id # => 83607730

String#+新しいオブジェクトを作成しました。したがって、 によって参照される新しいオブジェクトにtest_2[3] = "B"追加されます。参照が によって保持されているオブジェクトは変更されません。以下ではそうではありません:"B"test_2test_1

test_1 = "my test string"
test_2 = test_1

test_2.object_id # => 70466640
test_1.object_id # => 70466640

ここtest_2test_1両方が同じオブジェクトへの参照を保持します。したがって、あなたがやっているときtest_2[3] = "B"、それは基本的にローカル変数によって参照される同じオブジェクトで変更を行っていtest_1ますtest_2.

于 2013-10-26T18:49:23.030 に答える