気になったので調べた。
この順番で呼ばれる
- 特異メソッド
- extended module のメソッド
- class構文に書かれたメソッド
- included module のメソッド
- 親クラスのメソッド
include、extend の位置は関係なくこの順番。
include, extend される module で同名のメソッドがあった場合は、最後に include, extend された順番になる。
親クラスですでに include されている module は、子クラスで再度 include されても順番は親クラスの位置。
("A".."H").each do |name|
eval <<-MODULE
module #{name}
def hoge
"#{name} -> " + super
end
end
MODULE
end
class Base
def hoge
"Base"
end
end
class TestClass < Base
include A
include B
def hoge
"TestClass -> " + super
end
include C
include D
end
t = TestClass.new
t.extend E
t.extend F
def t.hoge
"t -> " + super
end
t.extend G
t.extend H
p t.hoge #=> "t -> H -> G -> F -> E -> TestClass -> D -> C -> B -> A -> Base"
class TestClass2 < TestClass
include A
include B
def hoge
"TestClass2 -> " + super
end
include C
include D
end
t = TestClass2.new
p t.hoge #=> "TestClass2 -> TestClass -> D -> C -> B -> A -> Base"