IntegerClass その後

結局、Integerから派生させるのは諦めて、普通にClassをつくり従来のInstanceMethodをほぼ全て(__id__,__send__,inspect以外)消してmethod_missingでto_s以外、全て内部で保持してるIntegerInstanceに渡す事にした。
こんなのいいのかなぁとか思いながら・・・
しかし、enum_instance.kind_of?(Integer)はtrueなのにInteger===enum_instanceはfalseになってしまっていて、これではcase文で嘘っぱちIntegerなのがばれてしまう。。。

self === obj


このメソッドは主に case 文での比較に用いられます。
objself と Object#kind_of?の関係がある時、真になります。つまり、case ではクラス、モジュールの所属関係をチェックすることになります。

しばらくコレをみて何でだおかしいよーと思ってたんですが、Rubyのソースをみててようやく気づいた。Object#kind_of?とは本当にObjectクラスで定義されたkind_ofだと。しかも後付けでdef Object.kind_of? とやっても駄目ですorz
要はCで書かれたソースの中でModule#===からrb_call系を使わず、つまりrubyフレームワーク(?)を使わずに直接Object#kind_of?のコードを呼び出してるんで、いくらClassでkind_of?メソッドを定義しても無駄のようです。
気になってリファレンスマニュアルとソースを見比べてたんですがObject#hogehogeをとか明記してある場合は、そういう事みたいで、ruby側で適宜Overwriteしたのが使われる場合はちゃんと「クラスで定義されている場合は」みたいな記述になってる(全部は到底チェックしてませんが。)。。。

今まで気づかなかった!!

で結局Module#===を再定義してもよくわからないけどだめで、Integer#===を再定義する事にして、どんどん気持ちの悪いコードを生産する事になったのでした。TT