9

誰でもその行動を説明できますか

シナリオ-1

str = "hello"
str1 = str
puts str #=> hello
puts str1 #=> hello

str1 = "hi"
puts str1 #=> hi
puts str #=> hello

ここで、 の値を変更しても の値にstr1は影響しませんstr

シナリオ-2

str = "hello"
str1 = str
str1.gsub! "hello", "whoa!"
puts str1 #=> whoa
puts str #=> whoa

gsub!効果だけじゃないのstr1?なぜ変化しているのstrですか?str1への参照のみを保持している場合、シナリオ 1strで値が変更されなかったのはなぜですか?

4

2 に答える 2

17

以下を注意深く見てください。

シナリオ-1

str = "hello"
str1 = str
puts str #=> hello
puts str1 #=> hello
p str.object_id #=>15852348
p str1.object_id #=> 15852348

上記の場合strstr1によって証明される同じオブジェクトへの参照を保持していobject_idます。以下のケースでは、ローカル変数を使用しstr1て新しいオブジェクトを保持しています"hi"。これは、2 つの異なる によっても証明されていobject_idます。

str1 = "hi"
puts str1 #=> hi
puts str #=> hello
p str.object_id  #=> 15852348
p str1.object_id #=> 15852300

シナリオ-2

`文字列#gsub! 言います:

その場で String#gsub の置換を実行し、str を返すか、置換が実行されなかった場合は nil を返します。ブロックも置換も指定されていない場合は、代わりに列挙子が返されます。

str = "hello"
str1 = str
str1.gsub! "hello", "whoa!"
puts str1 #=> whoa
puts str #=> whoa
p str.object_id #=>16245792
p str1.object_id #=>16245792
于 2013-04-26T06:46:16.863 に答える
0

変数の代入では、同じ名前の変数が存在するかどうか、存在する場合はその値が何であったかは影響しません。シナリオ 1 では、str最終的に が割り当てられstr1 = "hi"、それ以前に何が起こったかは関係ありません。シナリオ 1 は、 を除いた以下と同じstr1 = strです。

str = "hello"
str1 = "hi"

シナリオ 2 では、strstrが同じ文字列を参照しています。その文字列を指す変数の1つを介してそれを変更すると、他の変数を介して呼び出すと、同じ変更された文字列が参照されます。

于 2013-04-26T07:05:27.430 に答える