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

結果


"gabugabu"
"da da da"
[Dog, Ability, Animal, Object, Kernel, BasicObject]
となる。DogとAnimalの間にAbilityモジュールが入っているのが分かります。という訳でAnimalよりもAbilityモジュールの方が近いから優先される訳です。