るりま作業 (備忘録)
rb_define_clss に関する説明が ruby-1.8.5 だとソース展開した直下の README.EXT (.ja もあり) に記述されている。
そういえば、という事で google 先生に聞いてみると青木さんのナニに hit。
試しに FalseClass を見てみるか。grep したら object.c にて rb_define_class が呼び出されている模様。この中の Init_Object() の中にて
rb_cFalseClass = rb_define_class("FalseClass", rb_cObject); rb_define_method(rb_cFalseClass, "to_s", false_to_s, 0); rb_define_method(rb_cFalseClass, "&", false_and, 1); rb_define_method(rb_cFalseClass, "|", false_or, 1); rb_define_method(rb_cFalseClass, "^", false_xor, 1); rb_undef_alloc_func(rb_cFalseClass); rb_undef_method(CLASS_OF(rb_cFalseClass), "new"); rb_define_global_const("FALSE", Qfalse);
というブロックが一連の手続きになっている模様。これは
- FalseClass というクラスを定義
- クラスメソドとして
- to_s の実体は false_to_s で引数無し
- & の実体は false_and で引数一つ
- | の実体は false_or で引数一つ
- ^ の実体は false_xor で引数一つ
というのは分かったのですが、それ以降の手続きは何か。
rb_undef_alloc_func は README.EXT.ja によると
クラスメソッドallocateを定義したり削除したりするための関数
とある。Class クラスのメソドとして定義されているようだけど、これは使わない、という意味か。
次、rb_undef_method はソースツリーの中、というか README.EXT には記述が無いですが、メソドを未定義にする、と読んで良い感じ。(ruby-dev において「未定義にする」というナニがあった (ruby-dev:12510)。
最後の rb_define_global_const は README.EXT に記述あり。拡張ライブラリが必要な定数、とある。
とりあえず、ソースツリーから組込みなクラスを探す方法は OK かな。例えば rubydoc/refm/api/src/_builtin/FalseClass は現状ではインスタンスメソドの
- &
- |
- ^
に #@todo が付いているな。がしかし上記ソースにも to_s なメソドが追加されてるし、ri FalseClass してみても
------------------------------------------------------ Class: FalseClass The global value +false+ is the only instance of class +FalseClass+ and represents a logically false value in boolean expressions. The class provides operators allowing +false+ to participate correctly in logical expressions. ------------------------------------------------------------------------ Instance methods: ----------------- &, ^, to_s, |
な出力。
疑問点としては
- to_s の記述の追加は不要か
- #@todo 部分だけ記述を追加すれば良いのか
という事かな。ML をもう一度見てみようか。