rubyでメソッドが優先される順番について
rubyでクラスの継承とmoduleのmixinを使う場合とで、同じ名前のメソッドがあったときに、どれが優先されるのか。
結論「一番関係が近い方のメソッドが優先される」です。
例えば以下の例
require 'ability' require 'animal' class Dog < Animal include Ability end
class Animal def eat p 'mogumogu' end def run p 'suta suta' end end
module Ability def run p 'da da da' end def eat p 'gabugabu' end end
Dogクラスのメソッドを呼び出してみる
$:.unshift(File.dirname(__FILE__)) require 'dog' @dog = Dog.new @dog.eat @dog.run p Dog.ancestors
結果
となる。DogとAnimalの間にAbilityモジュールが入っているのが分かります。という訳でAnimalよりもAbilityモジュールの方が近いから優先される訳です。
"gabugabu"
"da da da"
[Dog, Ability, Animal, Object, Kernel, BasicObject]