知らなくていいのか、知らないといけないのか

なんとなくRubyのオブジェクトとGCと変数の話。
初心者に説明するには難しい気がして敬遠しがちで、いつ出せばいいのかわからないような。


Rubyは全てがオブジェクトである、というのがウリの一つ。
全てがオブジェクトというのは、通常のクラスから生成するオブジェクトだけではなく、文字列や単純な数字までクラスがあり、実体はオブジェクトとして存在する、という意味。
Ruby

"abcde"

と書くと、"abcde"という文字列オブジェクトがメモリのどこかに生成されることになる。
どこに生成されたのかはわからないので、この文字列は使うことができない。
使われないので、いずれGCによって回収される運命にある。


GCガベージコレクションの略で、どこからも参照されないオブジェクトを解放してくれる仕組み。
上記の"abcde"は作っただけで参照されていないから、GCが動作したタイミングで解放される。

str = "abcde"

とすると、生成された"abcde"の場所を変数strが保持するようになる。
"abcde"をstrが束縛していて、この状態ならGCが動作しても"abcde"は解放されない。


Rubyの変数はこのようにオブジェクトの場所を指すための物である。
変数に入っているのはつまりオブジェクトのアドレスであって、オブジェクトそのものではない。

str = "abcde"
str2 = str
p str  #=>"abcde"
p str2 #=>"abcde"

このコードでは、strに入っている"abcde"のアドレスをstr2にコピーしている。
従って、strとstr2は同じ文字列を参照する。

str = "abcde"
str2 = "abcde"
p str  #=>"abcde"
p str2 #=>"abcde"

こちらは"abcde"を2個生成しているため、結果は同じに見えるが、strとstr2で指しているオブジェクトは別物だ。


同じオブジェクトを指す変数が複数ある場合、片方を変更するともう片方が参照するオブジェクトも変更される。同じものだから。

a = [1, 2, 3]
b = a
a.shift

p b #=>[2, 3]

このあたりになってくると解説記事なり書籍なりに書いてある話になる。
のでここまで。
内容には特に意味も目的無い。なんとなく考えたことを書いてみただけ。