モジュールの練習

モジュールのインスタンス変数名がぶつかったときどっちが勝つのか?

module Mod1
  def initialize
    @modval = 123
  end
  def print_mval1
    puts @modval
  end
end

module Mod2
  def initialize
    @modval = 456
  end
  def print_mval2
    puts @modval
  end
end

class Cls
  include Mod2
  include Mod1
end

c = Cls.new
c.print_mval1
c.print_mval2

結果:直近でincludeされたモジュール

mitsu@garlic$ ruby mod.rb
123
123


モジュールとクラスのinitializeはどっちが勝つか?

mitsu@garlic$ cat mod2.rb
module Mod1
  def initialize
    @modval = 123
  end
  def print_mval1
    puts @modval
  end
end

class Cls
  def initialize
    @clsval = 789
  end
  def print_cval
    puts @clsval
  end
  include Mod1
end

c = Cls.new
c.print_cval
c.print_mval1

mitsu@garlic$ ruby mod2.rb
789
nil

結果:クラスの勝ち。


当然、インスタンスにextendしたモジュールのinitializeは呼び出されない

mitsu@garlic$ cat mod3.rb
module Mod1
  def initialize
    @modval = 123
  end
  def print_mval1
    puts @modval
  end
end

class Cls
end

c = Cls.new
c.extend Mod1
c.print_mval1

mitsu@garlic$ ruby mod3.rb
nil