tarte記録 RSSフィード

2006-12-11

[]IntegerClass その後 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リファレンスマニュアル Module#===(obj)

しばらくコレをみて何でだおかしいよーと思ってたんですが、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

トラックバック - http://d.hatena.ne.jp/tarte/20061211/p1