2013-04-26 15 views
7

は、誰もがstr1の値を変更してstrの値には影響しない、行動ここ参照/コピーによる文字列の割り当てですか?

シナリオ-1

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

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

を説明することができます。

シナリオ-2

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

Shoudn't gsub!効果のみstr1?なぜそれが変更されますstrstr1strへの参照を保持している場合、のシナリオ1の値が変更されなかったのはなぜですか??以下注意深く

答えて

16

ルック:

シナリオ1 object_idによって証明されているのと同じオブジェクトへの参照を保持して上記ケースstrstr1において

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

。今度は、新しいオブジェクト"hi"を保持するために、ローカル変数str1を使用します。これは、2つの異なるobject_idによっても証明されています。

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

シナリオ-2

`String#gsub!は言う:

には置換が行われなかった場合はSTR、またはnilを返し、代わりに文字列番号のGSUBの置換を行います。ブロックがなく、置換がない場合は、代わりに列挙子が返されます。

変数代入において
str = "hello" 
str1 = str 
str1.gsub! "hello", "whoa!" 
puts str1 #=> whoa 
puts str #=> whoa 
p str.object_id #=>16245792 
p str1.object_id #=>16245792 
+1

あなたはそれに私を打ち負かす.... +1 – Salil

+1

よく書かれた答え。 –

+0

これはすべてに当てはまりますか?すべてがオブジェクトであり、すべてが参照によって割り当てられますか?通常、整数や浮動小数点数などの他の言語のプリミティブである他のものを含みますか? –

0

は、それが同じ名前を持つ変数であり、そうであれば、それがどのような値であったかどうか影響を及ぼしません。シナリオ1では、strに最終的にstr1 = "hi"が割り当てられ、それ以前に発生したことは無関係です。シナリオ1は、str1 = strを除き、次のものと同じです。シナリオ2では

str = "hello" 
str1 = "hi" 

strstrは同じ文字列を参照しています。その文字列を指す変数の1つを使ってその文字列を変更した場合、それを他の変数を介して呼び出すと、同じ変更された文字列を参照します。

関連する問題