2006-12-11
■[Ruby]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 === objRubyリファレンスマニュアル Module#===(obj) このメソッドは主に case 文での比較に用いられます。
obj が
selfと 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
- 6 http://d.hatena.ne.jp/keyworddiary/Ruby
- 2 http://d.hatena.ne.jp/keyword/ruby
- 2 http://d.hatena.ne.jp/keyworddiary/Ruby?date=20061211
- 2 http://reader.livedoor.com/reader/
- 2 http://www.google.co.jp/
- 2 http://www.google.co.jp/ig?sourceid=navclient-ff&ie=UTF-8&rls=GGGL,GGGL:2006-21,GGGL:ja&hl=ja
- 2 http://www.google.com.tw/search?q=ruby+dl2&hl=zh-TW&lr=&start=10&sa=N
- 1 http://d.hatena.ne.jp/keyworddiary/Ruby?date=20061210
- 1 http://search.yahoo.co.jp/search?p=Class+integerClass&aq=-1&oq=&ei=UTF-8&fr=top_ga1_sa&x=wrt
- 1 http://search.yahoo.co.jp/search?p=integer+ruby&ei=UTF-8&fr=moz2&rls=org.mozilla:ja-JP:official