未だまだ初歩ですが、Rubyについて勉強していて学んだことを忘れないように記載します
Rubyでは徹底的なオブジェクト指向が使われています それは整数や文字列についてもそうであり、それぞれ整数オブジェクトクラスや文字列オブジェクトクラスに属しています だから以下のような C/C++では考えられないことが普通に最初から行われます
puts 5
puts 5.to_i
puts 5.to_f
puts "SAITO"
puts "SAITO".reverse
この出力結果は
5
5
5.0
SAITO
OTIAS
となります つまり、何も自分では定義していないにもかかわらず最初から、整数クラスや文字列クラスが保持しているメソッドを読み出すことができます つまり、to_i (整数に変換する)、to_f (浮動小数点に変換する)、reverse (文字列を逆順にする)というメソッドを呼び出したのです
それでは自分で定義したクラスではどうでしょうか
class Animal
def say
puts "Nyaon Nyaon"
end
end
animal = Animal.new
animal.say
この出力は
Nyaon Nyaon
となります このまでは C++などでもともとオブジェクト指向プログラムをしている私としては簡単に普通に理解できます
しかし、ふと思いました これを C++で書くとどうなるか?
class Animal {
public:
Animal() {}
~Animal() {}
void say() {
std::cout << "Nyaon NYaon" << std::endl;
}
};
int main() {
Animal cat * new Animal();
cat->say();
delete cat;
}
このようになります ここで、catという変数名はその変数のアドレスを指しています そして、新たにnewで生成したならば、最後にdeleteしなければ、メモリーリークが発生します これに対して、Rubyではもともと言語にゴミ集め (ガベージコレクション)の機能が備わっているので、いちいち deleteせずともメモリーリークは発生しません ここいら辺は JAVAや BASICなどと同じです 本質的なことは、Rubyでは変数名というのは、全て変数のアドレスつまりポインタだということなのです たとえば C++で今のcatという変数生成を以下のようにした場合にはどうなるでしょうか
int main() {
Animal cat();
cat.say();
}
このようになり、矢印によるメソッド指定ではなく、ピリオドによる指定となります そして、この場合にはcatという変数そのものを指していて、アドレスを指しているのではありません そして、このcatというのは newで生成した場合には、HEAP領域に作られますが、このように直接生成した場合には、STACK領域に取られるのです つまり、もしもこの catというものの実態が非常にメモリーを浪費するものであったとすれば、一挙に Stackを消費尽くしてしまい、プログラムは破壊され システムも障害を受けるでしょう
Rubyの場合変数であれ、何であれ全て(多分) HEAP領域に確保され、そこに対するポインターのみが存在するのです これは新たに知った大きな知識でした