【Ruby】includeとextendの違いについて

はじめに

railsでmoduleを使用する際に出て来るincludeとかextend 何が違うねんってのを調べたときの調査結果。

結論

結論1

includeでモジュールを取り込むとモジュール内に定義したメソッドはインスタンスメソッドになり、 extendでモジュールを取り込むとモジュール内に定義したメソッドはクラスメソッドになる。

結論2

module内でselfを使用したときに、includeの場合、インスタンスを指し、extendの場合はクラスを指す。

検証

以下、実際の検証コードと結果。

検証1

module Hoge
  def puts_hoge
    puts "hoge"
  end
end

class Piyo
  include Hoge
end

piyo = Piyo.new
piyo.puts_hoge
# => hoge
Piyo.puts_hoge
# => hoge.rb:12:in `<main>': undefined method `puts_hoge' for Piyo:Class (NoMethodError)

module Hoge
  def puts_hoge
    puts "hoge"
  end
end

class Piyo
  extend Hoge
end

piyo = Piyo.new
piyo.puts_hoge
# => hoge.rb:12:in `<main>': undefined method `puts_hoge' for #<Piyo:0x007fb8f90272b8> (NoMethodError)
Piyo.puts_hoge
# => hoge

検証2

module Hoge
  def puts_self
    puts self
  end
end

class Piyo
  include Hoge
end

piyo = Piyo.new
piyo.puts_self
# => #<Piyo:0x007faf030275d8>

module Hoge
  def puts_self
    puts self
  end
end

class Piyo
  extend Hoge
end

Piyo.puts_self
# => Piyo