プログラミング入門(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)
上記のサンプルでは「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")
上記のようにモジュール内で定義されたメソッドを関数のように呼び出すことができる。
モジュールをインクルードする
先ほど勉強したように、モジュールに含まれるメソッドは「モジュール名.メソッド名」のように実行するが、実行する回数が多い場合などは先にモジュールをインクルードしておくことで、単に「メソッド名」の形で実行することもできる。
モジュールをインクルードするには次のように記述する。
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")
クラスの中にモジュールをインクルードする
クラスの中にモジュールをインクルードする
今度はクラスの中にインクルードする方法を勉強する。
クラスの中でモジュールを利用するようにするには次のように記述する。
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)