LoginSignup
12
5

More than 3 years have passed since last update.

【Ruby】includeとextendの違い。クラスメソッドとインスタンスメソッドの違いと実例。

Posted at

【Ruby】includeとextendの違い。クラスメソッドとインスタンスメソッドの違いと実例。

目次

  1. includeとextendとは?
  2. includeとextendの違い
  3. クラスメソッドとインスタンスメソッドの違い
  4. クラスメソッドとインスタンスメソッドの使い分け
  5. includeとextendの実例


includeとextendとは?

どちらも、クラスの中でモジュールを呼び出すときに使う(mixin ミクシン)。

モジュールとmixinとは?

includeとextendの違い

読み込んだモジュールのメソッドを、インスタンスメソッドかクラスメソッドのどちらで読み込むかの違い。

メソッド 意味
include インスタンスメソッドとして読み込む
extend クラスメソッドとして読み込む


クラスメソッドとインスタンスメソッドの違い

その名の通り、クラスから呼び出せるメソッドか、インスタンスから呼び出せるメソッドかの違い。

メソッド 呼び出し
クラスメソッド <クラス名>.<メソッド名>
インスタンスメソッド <クラス名>.new.<メソッド名>

クラスメソッドは、クラスから直接メソッドを呼び出せる

インスタンスの場合は、クラスからnewを使って、インスタンスを生成して、メソッドを呼び出す


クラスメソッドとインスタンスメソッドの使い分け

メソッド 用途
クラスメソッド 全体で共通
インスタンスメソッド インスタンス毎に固有

インスタンスメソッド

メソッドの結果が生成したインスタンス毎に固有となるメソッドを定義していく。(例えば、苗字や名前を登録するなど。)

インスタンスメソッド
class <クラス名>
  def <メソッド名>
    処理
  end
end
呼び出し
<クラス名>.new.<メソッド名>


クラスメソッド

DBから指定したデータを抽出する場合など、どのインスタンスでも同じ答えが返るメソッドに使う

  • メソッド名の前にselfがつく
  • メソッドはクラス名の後で直接呼び出せる(インスタンスを生成する必要がない)
インスタンスメソッド
class <クラス名>
  def self.<メソッド名>
    処理
  end
end
呼び出し
<クラス名>.<メソッド名>


includeとextendの実例

include

インスタンスメソッドとして読み込む

include
module Aaa
  def hello(name)
    p "こんにちは、#{name}さん"
  end
end


#モジュールの読み込み(mixin)
class Xxx
  include Aaa
end 

#メソッドの実行
Xxx.new.hello("山田")

 => "こんにちは、山田さん"

▼クラスはNG

NG
Xxx.new.hello
NoMethodError (undefined method `hello' for Xxx:Class)


extend

クラスメソッドとして読み込む

extend
module Bbb
  def hello
    p "皆さん、こんにちは"
  end
end


#モジュールの読み込み(mixin)
class Yyy
  extend Bbb
end 

#メソッドの実行
Yyy.hello

 => "皆さん、こんにちは"

▼インスタンスはNG

NG
Yyy.new.hello
NoMethodError (undefined method `hello' for #<Yyy:0x00007f81b2083410>)



以上。

12
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
5