【Ruby】モジュールのincludeとextendの違い
はじめに
Rubyのモジュールをミックスインする方法として、include
とextend
がありますが、この2つの違いについて、学んだことをまとめたいと思います。
結論
ミックスインされるモジュールに定義されたメソッドをどう呼び出すか、という点で2つは異なります。
include
はインスタンスメソッドとして、extend
はクラスメソッドとして呼び出します。
実際のコード
include
module M def method_m; "method_m"; end end class A include M end a = A.new a.method_m #=> "method_m" A.method_m #=> NoMethodError: undefined method `method_m' for A:Class
Mモジュールをinclude
したAクラスでは、Mで定義されたmethod_m
がインスタンスメソッドとして呼び出されています。
extend
module M def method_m; "method_m"; end end class B extend M end b = B.new b.method_m #=> NoMethodError: undefined method `method_m'... B.method_m #=> "method_m"
Mモジュールをextend
したBクラスでは、Mで定義されたmethod_m
がクラスメソッドとして呼び出されています。