もりきゅうです。

Kazuhiro Nishiyama さんは書きました:
>以下のように複数のmoduleをincludeするとsuperで後の方のmoduleの
>initializeしか呼ばれないようですが、M1のinitializeが呼ばれる
>ようにするにはどうするのでしょうか?

module での initialize という名のメソッドは混乱のもとだから
使わないってのはどうかな。^^;

Mix-in は継承ではないのだから。

つまり,
module M1
  def p1
    p @s1
  end
end

とした場合,@s1 は M1 のものではなく,M1 を include したクラス
例えば C のものである。# だからインスタンス変数って言うんだな

だから,@s1 を初期化する,つまり初めて代入するのは C の仕事な
わけで,
  def initialize(s)
    @s1 = s
  end
は C にあるべき。

たとえ,この仕事を M1 にやらせようと考えた場合でも
  attr :s1, true
とか,
  def set_s1(v)
    @s1 = v
  end
とか,になるはず。

で,M1 と M2 の関わりで @s1 と @s2 が関連するならともかく,
これらのインスタンス変数の初期化をするのに,同じメソッド名
(この場合は initialize なんだけど)を使う必然性はない。

と,こんなふうに考えますがいかがでしょう。

----
Kazuhiro Yoshida  moriq.kazuhiro / nifty.ne.jp