0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[Ruby] include, prepend, extend の違い

Posted at

個人的に忘れがちなものなので、自分用でメモしておきます。

間違いがありましたら、ぜひご指摘お願いします!

用途による分け方

用途 キーワード 個人的な
使用頻度
あるモジュールのインスタンスメソッドが欲しい
かつ、今のクラスやモジュールの定義を優先したい
Module#include
あるモジュールのインスタンスメソッドが欲しい
かつ、今のクラスやモジュールのインスタンスメソッド定義より優先したい
Module#prepend
あるモジュールのインスタンスメソッドが欲しい
かつ、特異メソッドとして欲しい
Object#extend

メソッド呼び出しの順番

Module#include

  • 今のクラスやモジュールが一番優先して呼び出される
  • 遅くincludeされるほど、呼び出す時の優先度が上がる
module Three; end
module Two; end

class One
  include Three
  include Two
end

p One.ancestors

#=> [One, Two, Three, Object, PP::ObjectMixin, Kernel, BasicObject]

Module#prepend

  • 今のクラスやモジュールより優先して呼び出される
  • 遅くprependされるほど、呼び出す時の優先度が上がる
module Three; end
module Two; end

class One
  prepend Three
  prepend Two
end

p One.ancestors

#=> [Two, Three, One, Object, PP::ObjectMixin, Kernel, BasicObject]

Object#extend

  • あるモジュールのインスタンスメソッド特異メソッドとして読み込まれる
  • 遅くextendされるほど、呼び出す時の優先度が上がる

クラスの特異メソッドとして読み込む

module Three
  def print_three; end
end

module Two
  def print_two; end
end

class One
  extend Three
  extend Two
end

p One.ancestors
#=> [One, Object, PP::ObjectMixin, Kernel, BasicObject]

One.singleton_methods
#=> [:print_two, :print_three]

インスタンスの特異メソッドとして読み込む

module Three
  def print_three; end
end

module Two
  def print_two; end
end

class One
  extend Three
  extend Two
end

obj = Object.new
obj.extend Three, Two

obj.singleton_methods
#=> [:print_two, :print_three]

用語

  • 特異メソッド:
    あるオブジェクトに特化したメソッドのこと。特異メソッドを確認するためにはオブジェクト#singleton_methodsを呼び出すとおっけー
0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?