なかだです。

At Thu, 1 Aug 2002 20:04:48 +0900,
Shin'ya Adzumi wrote:
> > 私が不勉強なため各クラスの初期化順番等を把握していないせいなのかもしれ
> > ませんが、Cのrb_define_class()で生成したクラスとスクリプト内で生成した
> > クラスとでは、Cで生成したクラスの方が優先的に初期化されたりするのでしょ
> > うか
> 
> どうも Socket::new が initizalize を見てない(そもそも
> Socket#initialize がない)実装になっていることが原因みたいで
> すね。他にもこういうライブラリがあるのかな。

以前はnewだけをオーバーライドしているものが多かったのですが、組
込みクラスに関してはinitializeを呼ぶようになっています。拡張ラ
イブラリについても、大部分はそうなっているんですが、まだいくつ
か例外があります。これを機に、一気に修正?

    Curses::Window	1.6, 1.7
    TclTkIp		1.6, 1.7
    StringScanner	1.7
    Socket関連		1.6


ちなみに、initializeが呼ばれない場合は、newをオーバーライドする
必要があります。

class TestSock < Socket
  if method(:new).arity < 0
    def initialize
      super Socket::AF_INET, Socket::SOCK_DGRAM, 0
    end
  else
    def self.new
      super Socket::AF_INET, Socket::SOCK_DGRAM, 0
    end
  end
end

-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦