プログラミング入門(7)〜モジュール

下記のページを参考にプログラミングの勉強を行います。
モジュールの定義 - モジュール - Ruby入門
モジュールを関数のように使う - モジュール - Ruby入門
クラスの中にモジュールをインクルードする - モジュール - Ruby入門

モジュールの定義


モジュールの定義


モジュールは次のようなもの。

module モジュール名

end

モジュールは「module」から始まり「end」で終わりとなり、モジュールにはモジュール名を指定する。

モジュール名はモジュールを識別するための名前で、大文字のアルファベットから始まる。
例えば「HeikinModule」というモジュールを定義するには次のように行う。

module HeikinModule
  def heikin(x, y)
    kekka = (x + y) / 2
    print(kekka)
  end
end

モジュールはクラスと同じくメソッドを定義することができる。クラス変数に相当するものはモジュールにないが、定数は定義することができる。

このように、モジュールはクラスに非常に似た構成を持っているが、大きな違いとしてクラスはクラスからオブジェクトを作成することができるが、モジュールでは作成することができない。
モジュールの利用方法としては「モジュール名.メソッド名」の形式で関数のように実行するか、またはほかのクラスの中にインクルードして利用することができる。

クラスでは継承をサポートしており、1つの期間クラスを継承して複数のクラスを作成することができる。これによって、同じような機能を持つクラスを別々に1から作成する必要はない。しかし、同じような機能が必要だったとしても、全く別の目的のクラスである場合はクラスの継承によって共通化する部分を作成するにはおかしい場合がある。そのような場合に共通となる機能をモジュールとして定義し、各クラスにインクルードして利用することでコードの再利用性を高めることができる。

サンプルプログラム

module HeikinModule
  def heikin(x, y)
    kekka = (x + y) / 2
    return kekka
  end
end

class Test
  include HeikinModule

  def dispHeikin(x, y)
    kekka = heikin(x, y)
    print(x, "", y,"の平均は",kekka,"です\n")
  end
end

test = Test.new
test.dispHeikin(10, 8)

f:id:ayaketan:20111213163704j:image

上記のサンプルでは「Test」クラスの中に「HeikinModule」を読み込んで利用している。このようにクラスの中に読み込まれたモジュールは、モジュールの中で定義されているメソッドをクラスの中から利用することができる。

モジュールを関数のように使う


モジュールを関数のように使う


モジュールはクラスのようにオブジェクトを作成することはできないので、モジュールの使用方法は関数のようにモジュール内に定義されたメソッドを実行するか、又はクラスの中にインクルードするかの2通りがある。ここでは関数のように使用する方法を勉強する。

例として次のようなモジュールを作成する。

module SuuchiModule
  def minValue(x, y)
    if (x < y)
      return x
    else
      return y
    end
  end

  def maxValue(x, y)
    if (x > y)
      return x
    else
      return y
    end
  end
end

このモジュールは数値関係のメソッドを定義したモジュールとなっている。

モジュールを関数のように実行するには、モジュール内のメソッドをモジュール関数として実行できるように設定する必要がある。
設定は次のように行う。

module_function:メソッド名

「module_function」の後にコロン(:)、そのあとにメソッド名を記述する。
先ほどの例であれば次のように記述する。

module SuuchiModule
  def minValue(x, y)
    if (x < y)
      return x
    else
      return y
    end
  end

  def maxValue(x, y)
    if (x > y)
      return x
    else
      return y
    end
  end

  module_function :minValue
  module_function :maxValue
end

これで「minValue」メソッドと「maxValue」メソッドは関数のように実行することができる。

次に実行が許可されたメソッドを実行するには次のように実行する。

モジュール名.メソッド名

モジュールはクラスのようにオブジェクトを作成できないので、このようにモジュール名を指定してメソッドを実行する。

module SuuchiModule
  def minValue(x, y)
    if (x < y)
      return x
    else
      return y
    end
  end

  def maxValue(x, y)
    if (x > y)
      return x
    else
      return y
    end
  end

  module_function :minValue
  module_function :maxValue
end

print(SuuchiModule.minValue(10, 8), "\n")
print(SuuchiModule.maxValue(10, 8), "\n")

f:id:ayaketan:20111213163730j:image

上記のようにモジュール内で定義されたメソッドを関数のように呼び出すことができる。

モジュールをインクルードする


先ほど勉強したように、モジュールに含まれるメソッドは「モジュール名.メソッド名」のように実行するが、実行する回数が多い場合などは先にモジュールをインクルードしておくことで、単に「メソッド名」の形で実行することもできる。

モジュールをインクルードするには次のように記述する。

include モジュール名

「include」文を記述してインクルードした後であれば、モジュールに含まれるメソッドを「メソッド名」という形式で実行することができる。

module SuuchiModule
  def minValue(x, y)
    if (x < y)
      return x
    else
      return y
    end
  end

  def maxValue(x, y)
    if (x > y)
      return x
    else
      return y
    end
  end

  module_function :minValue
  module_function :maxValue
end

include SuuchiModule
print(minValue(10, 8), "\n")
print(maxValue(10, 8), "\n")

f:id:ayaketan:20111213163746j:image

クラスの中にモジュールをインクルードする


クラスの中にモジュールをインクルードする


今度はクラスの中にインクルードする方法を勉強する。
クラスの中でモジュールを利用するようにするには次のように記述する。

include モジュール名

インクルードされたモジュールはクラス内のインスタンスメソッドと同じように実行することができる。

module SuuchiModule
  def minValue(x, y)
    if (x < y)
      return x
    else
      return y
    end
  end
end

class Test
  include SuuchiModule

  def dispValue(x, y)
    min = minValue(x, y)
    print("2つの値", x, "", y, "の中では小さい値は", min, "です\n")
  end
end

test = Test.new
test.dispValue(10, 8)

f:id:ayaketan:20111213163816j:image