モジュールMix-inのルール

スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 |
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般

クラス名は、ArrayやStringと名詞であるのに対し、ComparableやEnumerableなどモジュール名は形容詞が付いています。
モジュールは、クラスに共通するような機能を追加するために使われるというイメージです。
また、モジュールは、実際にはクラスの継承と同じように振舞います。

スポンサーリンク

module M1
  def method
    puts "モジュールM1のメソッド"
  end
end
 
module M2
  def method
    puts "モジュールM2のメソッド"
  end
end
 
module M3
  include M2
end
 
class C
  def method
    puts "クラスCのメソッド"
  end
  include M1
  include M2
end
 
class D
  include M1
  include M2
end
 
class E
  include M3
  include M1
end
 
p C.ancestors   # 単純継承のような動作
C.new.method    # 同名のメソッドはクラスのものが優先
 
D.new.method    # 後からインクルードしたモジュールのメソッドが優先
 
p E.ancestors   # 入れ子のモジュールも単純継承のような動作
 

実行結果。

[C, M2, M1, Object, Kernel]
クラスCのメソッド
モジュールM2のメソッド
[E, M1, M3, M2, Object, Kernel]

「C, M, Object, Kernel」とモジュール(M)がクラス(C)のancestorsに含まれていることを確認できます。
また、クラス内とモジュール内に同名のメソッドが含まれている場合は、クラスのメソッドが優先されます。
複数のモジュールをインクルードして同名のメソッドが含まれる場合は、後からインクルードされたモジュールのメソッドが優先されます。
また、モジュールが入れ子になっている場合も、単純継承のように振舞います。

スポンサーリンク
 
スポンサーリンク