9-1-3 モジュールの色々な利用方法を確認しよう

モジュールの定義方法

モジュールの定義方法は、クラスとほぼ同じように記述することができます。module モジュール名endで囲まれた部分がモジュールの定義です。

このモジュール定義の中に、def メソッド名endと記述し、メソッドをクラスと同じように定義できます。

# モジュールの定義方法
module モジュール名
  def メソッド名
    # 処理
  end
end

モジュールメソッド

モジュールメソッドとは、クラスメソッド(「7章 クラスを使おう」参照)同様、モジュール名.メソッド名と呼び出すことができるメソッドです。

クラスのインスタンスメソッド(「7章 クラスを使おう」参照)と同様に定義すると、そのままではモジュールに定義したメソッドを使用することはできません。

モジュールから直接呼び出すには2つの方法があります。

  • クラスメソッドと同じようにselfを使ってメソッドを定義する
  • module_functionを使ってメソッドを公開する

selfを使ってモジュールメソッドを定義する方法は、クラスメソッドの定義方法と全く同じ記述方法です。

# selfを使ってモジュールのメソッドを定義
module モジュール名
  def self.メソッド名
    # 処理
  end
end

# モジュールに定義したメソッドを呼び出す
モジュール名.メソッド名

一方、module_functionを使う定義方法は、モジュールメソッドを定義した後にmodule_function メソッド名のシンボルと記述します。

# module_function
module モジュール名
  def メソッド名
    # 処理
  end

  module_function :メソッド名
end

# モジュールに定義したメソッドを呼び出す
モジュール名.メソッド名

モジュールをクラスからincludeする

モジュールに定義したメソッドを使う別の方法として、クラスからモジュールをインクルードする方法があります。

クラスからモジュールをインクルードするには、クラス定義の中にinclude モジュール名と記述します。このように記述すると、モジュールに定義したメソッドをインスタンスメソッド(「7章 クラスを使おう」参照)として利用可能です。

# モジュールに定義したメソッドをクラスのインスタンスメソッドとして呼び出す
module モジュール名
  def メソッド名
    # 処理
  end
end

class クラス名
  include モジュール名
end

instance = クラス名.new
instance.メソッド名

モジュールをクラスからextendする

クラスからモジュールをインクルードする方法は、モジュールに定義したメソッドをクラスのインスタンスメソッドとして利用できるようにします。

インスタンスメソッドではなく、クラスメソッドとして利用する方法がエクステンド(extendです。

クラスからモジュールをエクステンドするには、クラス定義の中にextend モジュール名と記述します。

このように記述すると、モジュールに定義したメソッドをクラスメソッド(「7章 クラスを使おう」参照)として利用可能です。

# モジュールに定義したメソッドをクラスメソッドとして呼び出す
module モジュール名
  def メソッド名
    # 処理
  end
end

class クラス名
  extend モジュール名
end

クラス名.メソッド名

モジュールの色々な利用方法のまとめ

  • モジュールは処理のまとまりを表現する方法で、Classクラスのインスタンスの一種である
  • モジュールはクラスのようにインスタンスを生成したり、継承したりすることはできない
  • モジュールのメソッドを使用するには、モジュールメソッドとして定義する方法と、クラスからincludeextendする方法がある