LoginSignup
2
2

More than 5 years have passed since last update.

extendの優先度

Posted at

概要

元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

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2