【Ruby】includeとextendの違い。クラスメソッドとインスタンスメソッドの違いと実例。
##目次
##includeとextendとは? どちらも、クラスの中でモジュールを呼び出すときに使う(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>)
以上。