るりま作業 (備忘録)

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 をもう一度見てみようか。