Rails

クラスとモジュール

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という記述を使います。