豊福です。

  new と initialize について私の理解をまとめました。
つっこみ入れて下さい。


Cで扱っているデータを Ruby のオブジェクトにする
一般的なケースでの new と initialize について

・Objectのサブクラスとしてデータを扱うクラスを作る。

・インスタンスにはデータとそのデータの扱い方を知って
  いてもらわないと困るので new を定義しそこで教えて
  あげる必要がある。

・教えてあげる方法は Data_Wrap_Structマクロ等である。
  (インスタンスは T_DATA型になる)

・このクラスにサブクラスが作られるときのために new の
  中で initialize を呼ぶのが好ましいだろう。
  (ここで initialize を呼ばないとサブクラスのインス
   タンス生成のときに initialize が呼ばれなくなるから)
  initialize を呼ぶには rb_obj_call_init() を使う。
  このときの引数は new で受け取った引数をそのまま渡す。

・initialize を呼ぶとこのクラスの initialize かそれが
  定義されていなければ親クラスである Objectクラスの
  initialize が呼び出される。
  initialize を定義しなくても済むケースもあるが少なく
  とも new に引数があるときは定義しないわけにいかない。
  そうでないと引数を持ったまま Objectクラスの initialize
  が呼ばれ wrong # of arguments エラーになるからだ。
  new に引数があろうがなかろうが initialize を定義した
  方がわかりやすくてよいのではと私は思う。


Ruby/Jed の Bufferクラスの事情

・当初 T_DATA型を使おうとしていたが当時 T_OBJECT型以外
  ではインスタンス変数を持てなかったので T_OBJECT型を
  使う方法で実装した。

・基本的には Jed のバッファデータを wrap した T_DATA
  型オブジェクトを @data にもつ T_OBJECT型オブジェクト
  として構成されている。(が、話はそう単純ではない)

・Buffer#initialize は定義していない。Buffer.new は
  引数を持っているが当時は Object#initialize は引数を
  持つことを許していたので Buffer#initialize を定義し
  なくてもエラーにならなかった。

・現在は T_OBJECT型以外でもインスタンス変数を持てる
  ので今なら T_DATA型として実装してもよいかもしれない。

・Bufferのインスタンスオブジェクトはバッファデータを
  wrap していると同時にそのバッファデータからもポイント
  されている。こういう例は珍しい?
---
                        豊福
                        toyofuku / juice.or.jp