Webエンジニアへの転職を目指して、現在Ruby、Railsを学習中。

【Ruby】モジュールのincludeとextendの違い

はじめに

Rubyのモジュールをミックスインする方法として、includeextendがありますが、この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がクラスメソッドとして呼び出されています。