Edited at

クラスとモジュール

More than 1 year has passed since last update.

application_helper.rbやuser_helper.rb、static_page_helper.rbといったヘルパーにおいて下記のような記述があります。


application_helper.rb


module ApplicationHelper
def full_title(page_title)
base_title = "Ruby on Rails Tutorial Sample App"
if page_title.empty?
base_title
else
"#{page_title} | #{base_title}"
end
end

def bootstrap_class_for(flash_type)
case flash_type
when :success
"alert-success"
when :error
"alert-danger"
when :alert
"alert-warning"
when :notice
"alert-info"
else
flash_type.to_s
end
end
end


1行目のclassが来る位置にある「module」って一体何なんだろうと思って調べてみました。

結論から言ってしまいますが、

クラスはインスタンスを作るための設計図、つまりオブジェクトになることが出来るもの(インスタンス化できる)。

モジュールはインスタンス化できないが、処理を記述してめとめておくことができる。


モジュールはクラスに取り込むことが出来る

モジュールをクラスに取り込むことをmixinといいます。

ちなみにRubyではクラスを継承することができ、親のクラス(スーパークラス)のインスタンスメソッドを、子のクラス(サブクラス)が受け継ぎます。


taiyali.rb


module Taiyaki

def Oyoge_Taiyaki_kun
puts "まいにちまいにち"
puts "ぼくらはてっぱんのうえで"
end

def taiyaki
@taiyaki = "taiyakikun"
end
end

class Yatai
def the_tayai
puts "屋台グルメは美味しい"
end
end

class TaiyakiYatai < Yatai
include Taiyaki
def anko
@anko = "anko"
end

def custard
@custard = "custard"
end

def shiro_an
@shiro_an = "shiro_an"
end

def self.name
"Taiyakikun Shop"
end
end


上記のコードでは、TaiyakiYataiクラスはYataiクラスを継承しています。

更に、20行目の「include Taiyaki」という記述により、TaiyakiYataiクラスはTaiyakiモジュールをmixinしていることになります。

つまりどういうことかというと・・・

Yataiクラスで定義されているインスタンスメソッド(the_Yatai)はTaiyakiYataiクラスで使用できます。

(19行目の「class TaiyakiYatai < Yatai」という記述によりYataiクラスがスーパークラス、TaiyakiYataiクラスがサブクラスという関係になっているためです)

そしてTaiyakiYataiクラスはTaiyakiモジュールをmixinしているため、Taiyakiモジュールで定義されているインスタンスメソッド(Oyoge_Taiyaki_kun)はTaiyakiYataiクラスで使用することが出来ます。


まとめ

クラスはインスタンス化する能力を持ち、メソッドを格納することが出来ます。

モジュールはインスタンス化する能力を持たないが、メソッドを格納することができます。

クラスにモジュールを取り込むことをmixinと呼び、コード内ではincludeという記述を使います。