個人的に忘れがちなものなので、自分用でメモしておきます。
間違いがありましたら、ぜひご指摘お願いします!
用途による分け方
用途 | キーワード | 個人的な 使用頻度 |
---|---|---|
あるモジュールのインスタンスメソッドが欲しい かつ、今のクラスやモジュールの定義を優先したい |
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を呼び出すとおっけー