【ruby】include VS extend

include

定義

moduleで定義されたメソッドを追加

rubyは多重継承は出来ないため、includeで必要な機能を追加 通常、moduleはインスタンスメソッドを使用出来ない。 includeしたクラスのスーパークラスとして継承されるため、 moduleに定義されたインスタンスメソッドが使用出来る。

extend

定義

モジュールで定義されたメソッドをselfの特異メソッドとして追加。

例えば、class内でextendした場合はmodule内で定義したmethodは クラスメソッドとして追加される。

module ModuleTest
  def module_test
    puts "test"
  end
end

Class IncludeTest
  include ModuleTest
end

Class ExtendTest
  extend ModuleTest
end

IncludeTest.new.module_test #test
ExtendTest.module_test #test