mixin、ミキシン。

mixin、よく耳にしてはいたけど、何をするか全然わかっていなかったのでお勉強。そして読み方も。ミックスインって読んでたけど、Google多数決で確認したところ、ミキシンが圧倒的に多かったのでこれからはミキシンって読む。

module Hoge
  def puts_hoge
    puts "hoge"
  end

  class Poyo
    def puts_poyo
      puts "poyo"
    end
  end
end

module Piyo
  def puts_piyo
    puts "piyo"
  end
end

class Huga
  include Hoge
  include Piyo
  def puts_poyo
    poyo = Poyo.new
    poyo.puts_poyo
  end
end

huga = Huga.new
huga.puts_hoge
huga.puts_piyo
huga.puts_poyo

結果。

hoge
piyo
poyo

何となくわかった。モジュール内のメソッドをクラスの中に取り込むことが出来るのだ。そしてそれは複数のモジュールを取り込むことが可能。
もし複数のモジュール間で同名のメソッドがある場合はどうなるのか?
Piyoクラスをこんな風に書き換えた。

module Piyo
  def puts_hoge
    puts "piyo"
  end
end

そして実行。

huga = Huga.new
huga.puts_hoge

結果。

piyo

エラーにならない。どういう順番でputs_hogeが呼ばれているのか。includeした順で最も新しいのが呼ばれるのか。
それではHogeクラスでのincludeする順番を変えてみよう。

include Piyo
include Hoge

実行結果。

piyo

あれれれ〜変わらないや。
それじゃ、モジュールが定義されている順番?
PiyoクラスをHogeクラスの上に移動させて実行。

hoge

いえすっ!
最も新しく定義されているものが呼び出させるようだ。