Ruby モジュール(Module)
モジュール(Module)は、メソッド、クラス、定数をまとめる方法です。モジュール(Module)には大きな利点が2つあります。
- モジュールは名前空間を提供し、名前の衝突を避けます。
- モジュールはmixinミックスイン機構を実装します。
モジュール(Module)は名前空間を定義し、これはサンドボックスに相当します。その中では、あなたのメソッドや定数は他の場所のメソッドや定数と衝突しません。
モジュールはクラスに似ていますが、次の点が異なります:
- モジュールはインスタンス化できません
- モジュールにはサブクラスがありません
- モジュールは別のモジュールによってのみ定義できます
構文
モジュール定数の命名はクラス定数の命名と似ており、大文字で始まります。メソッド定義も似ています:モジュールメソッドの定義はクラスメソッドの定義と似ています。
クラスメソッドと同様に、メソッド名の前にモジュール名とピリオドを置くことでモジュールメソッドを呼び出すことができます。また、モジュール名とコロン2つ(::)を使用して定数を参照できます。
例
同じ関数名でも機能が異なる複数のモジュールを定義できます:
例
クラスメソッドと同様に、モジュール内でメソッドを定義するとき、モジュール名の後にピリオド、その後にメソッド名を指定できます。
Ruby require文
require文は、C や C++ の include文、Java の import文に似ています。第三者のプログラムが定義済みのモジュールを使用したい場合、単に Ruby のrequire文を使用してモジュールファイルを読み込むことができます:
構文
構文
ここでは、ファイル拡張子は.rb必須ではありません。
例
ここでは、次を使用します$LOAD_PATH << '.'これにより、Ruby は参照されたファイルを現在のディレクトリ内で検索する必要があることを認識します。$LOAD_PATH を使用したくない場合は、次を使用できますrequire_relativeを使用して、相対ディレクトリからファイルを参照します。
注意:ここでは、ファイルに同じ関数名が含まれています。そのため、呼び出しプログラムでコードの曖昧さが生じる可能性がありますが、モジュールはこの曖昧さを回避し、モジュール名を使用して適切な関数を呼び出すことができます。
Ruby include文
モジュールはクラスに組み込むことができます。クラスにモジュールを組み込むには、クラス内でinclude文を使用します:
構文
モジュールが別のファイルで定義されている場合、モジュールを組み込む前にrequire文を使用してそのファイルを参照する必要があります。
例
次のモジュールがsupport.rbファイルに書かれているとします。
次に、クラス内でそのモジュールを次のように参照できます:
例
これにより、次の結果が得られます:
Sunday You have four weeks in a month You have 52 weeks in a year Sunday 120
Ruby における Mixins
このセクションを読む前に、オブジェクト指向の概念をある程度理解しておく必要があります。
クラスが複数の親クラスから特性を継承できる場合、そのクラスは多重継承を示します。
Ruby は多重継承を直接サポートしていませんが、Ruby のモジュール(Module)にはもう1つの素晴らしい機能があります。それは多重継承の必要性をほぼ排除し、mixinという機構を提供します。
Ruby は実際には多重継承メカニズムを実装しておらず、代わりに mixin テクニックを採用しています。モジュールをクラス定義に include すると、モジュール内のメソッドがクラスに mix されます。
次のサンプルコードを見て、mixin を詳しく理解しましょう:
例
- モジュール A はメソッド a1 と a2 で構成されています。
- モジュール B はメソッド b1 と b2 で構成されています。
- クラス Sample はモジュール A と B を含みます。
- クラス Sample は4つのメソッドすべて、すなわち a1、a2、b1、b2 にアクセスできます。 したがって、クラス Sample が2つのモジュールを継承していることがわかります。クラス Sample は多重継承または mixin 。