最終更新: 2012-01-26T13:29+0900
Rubyに来たときは意識しなかったが、最近 Ruby側から C++を眺めたときにあまりの違いに恐れおののいたこと(限りあるスタックの使いすぎに注意しようね)。
# Ruby myobject = MyClass.new();
// C++ MyClass myobject; MyClass *pmyobject = &myobject;
Rubyでは MyClass.new()で MyClassのインスタンスを作り、それを後から参照するために myobjectという名札を貼り付けている。C++では MyClass myobject; だけで既にインスタンスが存在していて、名札を貼り付ける行為は二行目が相当する。Rubyには myobjectのようにオブジェクトそのものを表す変数は存在しない*⁑⁂。
書いてて思った。ポインタ(に近いもの。参照。C++の参照とは違うもの)はスクリプト言語では普通に使われている*4。Rubyでは C++の myobjectに相当するものがなく、全てのオブジェクトが一段遠くにあるから、C++でやるように (*pmyobject).hoge() や pmyobject->hoge() というようにポインタをデリファレンスする手間を省いて myobject.hoge() という書き方でメソッドを呼べるが、Rubyの myobjectは C++の、myobjectよりむしろポインタの pmyobjectに一番近い。
* Fixnumは例外。
⁑ これが Rubyに ++、--が存在しない理由かとも思ったが、C++で単項インクリメント/デクリメントをメンバ関数でオーバーロードできることを考えると Rubyでやっていけない理由がわからない。Rubyでも ++相当のメソッドを定義できるということだし、全てがオブジェクト(内部状態を持てる)であることを謳っている Rubyだからこそ制約なしにやっても構わないんじゃ。http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/5323。
⁂ いやいやいや、仮に ++/--というメッセージが追加されても Numericはイミュータブルだという理由で使えなければ 99%の利用場面が奪われる。これをなんとかすると ++が +=のシンタックスシュガーになったり、Fixnumがオブジェクトでない(=変数がオブジェクトへの参照でない)ことが露呈したり、a=b=1; ++b; で a が 2 になったりする。これは違う。
*4 C++の &のような、明示的にアドレスを取得する方法がないので、ポインタのポインタは存在しない。