ソースを見てみる (3)
_るりま_なエントリをチェックしてたら FalseClass の to_s メソドについての記述あり。ML に投げる等と書いてあるがしてないし。備忘録としてこっちに書いとく。
で、ソースのチェックなんですが、
- Object クラスのメソドの定義を洗い出し
- ソースのチェックと_るりま_なソースとの比較
をしようとしているんでした。とりあえず Object クラスのメソドについては_るりま_な Object のソースと ruby のソースとの間での紐は付いたっぽいので整理しつつ検証。
ソースツリーを mKernel で grep してみたトコロ、以下のメソドが出てきた。
- eval.c
- respond_to?
- send
- __send__
- instance_eval
- extend
- method
- gc.c
- hash
- __id__
- object_id
- io.c
- display
- object.c
- nil?
- ==
- equal?
- ===
- =~
- eql?
- id
- type
- class
- clone
- dup
- initialize
- taint
- tainted?
- untaint
- freeze
- frozen?
- to_a
- to_s
- inspect
- methods
- singleton
- protected_methods
- private_methods
- public_methods
- instance_variables
- instance_variable_get
- instance_variable_set
- remove_instance_variable (private)
- instance_of?
- kind_of?
- is_a?
- singleton_method_added (private)
- singleton_method_removed (private)
- singleton_method_undefined (private)
- ext/enumerator/enumerator.c
上記と_るりま_な Object のソースのメソドとの差分が以下。
- _dump
- initialize
- instance_variable_defined?
- marshal_dump
- marshal_load
- method_missing
- new
- to_ary
- to_hash
- to_int
- to_str
全部_るりま_なソースに存在しますが、ソースツリー上で見つけきれていない。
ちなみに以下のコマンドだと
$ ruby-1.8.5 -e 'Object.methods.each {|o| print o; print "\n" }'|sort|lv
もっと沢山差分があります。が、これについてはクラスメソドとしてメタクラスが継承しているものも含んでいるはず。でも _dump とか initialize とか無い。
... って、object.c で rb_define_private_method してるな、initialize は。あと、rb_define_alloc_func で allocate メソドも定義しているな。これは_るりま_なソレには入っていません。何故だ。ちなみに Object.methods には存在します。
あるいは instance_variable_defined? は ruby-1.8.6 から追加されたメソドなので、ruby-1.8.5 で grep かけても見つかりっこナシ。ちなみに先日オトした 1.8.6 なソースツリーでは grep で網にかかっています。
new は Class のメソドとして定義されているので (object.c)、Object にクラスメソドとして継承されている、と見て良いのか。
_dump とか marshal_* についてはオブジェクトシリアライズなソレだとゆーのは理解できるんですが、どうやって Object で実装しているのかが不明。てーか、見たトコロでは _dump とか marshal_dump とか marshal_load とかを定義すれば、なカンジに見えるな、現行マニュアルも_るりま_なソレも、あるいは実装も。
$ ruby -e 'Object.methods.each { |i| print i; print "\n" }'|grep dump $ ruby -e 'Object.methods.each { |i| print i; print "\n" }'|grep marshal $ ruby -e 'Object.new.methods.each { |i| print i; print "\n" }'|grep marshal $ ruby -e 'Object.new.methods.each { |i| print i; print "\n" }'|grep dump $ ruby -v ruby 1.8.2 (2005-04-11) [i386-linux] $
うーん。
あるいは to_{ary, hash, int, str} なソレは? と言いつつ現行リファレンスマニュアルを見ると
to_ary, to_hash, to_int, to_str は、説明の便宜上このページに書いてますが、デフォルトでは Object のメソッドとしては定義されていません
って。_便宜上_の意図は ML で確認してみた方が良い?
追記
今気がついたんですが、method_missing も微妙。