Rubyの変数の考え方は、オブジェクト自体ではなく、オブジェクトの参照です。

変数に値を代入するときは、代入先の変数の中にオブジェクトをコピーするのではなく、変数にオブジェクトの参照を格納しています。


Stringオブジェクトを作り、参照を s に格納します。 参照のコピーを作って t に格納すると、 st は同じオブジェクトを参照します。

s = "Ruby"
t = s       # => "Ruby"


t に格納された参照を介してオブジェクトを一部書き換えます。 ts は同じオブジェクトを参照しているので、結果は同じになります。

t[-1] = "r"
puts t      # => Rubr
puts s      # => Rubr

t 自体に別のStringオブジェクトを代入すると、sとは別のオブジェクトを参照することになります。

t = "Python"
puts s      # => Rubr
puts t      # => Python

s[0] = 'g'
puts s      # => gubr
puts t      # => Python


ちなみに、Rubyのメソッドの引数は、値渡しで参照を渡しています

2025/01/01