クラス名は、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に含まれていることを確認できます。
また、クラス内とモジュール内に同名のメソッドが含まれている場合は、クラスのメソッドが優先されます。
複数のモジュールをインクルードして同名のメソッドが含まれる場合は、後からインクルードされたモジュールのメソッドが優先されます。
また、モジュールが入れ子になっている場合も、単純継承のように振舞います。
■この記事のトラックバックURL:
http://www.mapee.jp/mpe334/mt-tb.cgi/422