【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