概要
元classとextendするmoduleに同名メソッドがあった場合、どれが使われるのか調べてみた。
準備
first_module.rb
module FirstModule
def befo
p 'first'
end
def say
p 'first'
end
def modu
p 'first'
end
def first
p 'first'
end
end
last_module.rb
module LastModule
def befo
p 'last'
end
def say
p 'last'
end
def modu
p 'last'
end
def last
p 'last'
end
end
sasaki.rb
require 'first_module'
require 'last_module'
class Sasaki
def self.befo
p 'original'
end
extend FirstModule
extend LastModule
def self.say
p 'original'
end
def self.orig
p 'original'
end
end
結果
元classのメソッドは使える(当然)
Sasaki.orig #=> "original"
moduleの各メソッドも使える(extendの確認)
Sasaki.first #=> "first"
Sasaki.last #=> "last"
moduleの同名メソッドは後にextendされた方が採用される
Sasaki.modu #=> "last"
同名メソッドは元classでの定義が一番優先される
Sasaki.say #=> "original"
extend指定の方が後でも元classの定義が一番優先される
Sasaki.befo #=> "original"
まとめ
優先度は以下の通り。
元ファイル > 最後にextendされたmodule > 最初にextendされたmodule