Ruby モジュール(Module)

モジュール(Module)は、メソッド、クラス、定数をまとめる方法です。モジュール(Module)には大きな利点が2つあります。

  • モジュールは名前空間を提供し、名前の衝突を避けます。
  • モジュールはmixinミックスイン機構を実装します。

モジュール(Module)は名前空間を定義し、これはサンドボックスに相当します。その中では、あなたのメソッドや定数は他の場所のメソッドや定数と衝突しません。

モジュールはクラスに似ていますが、次の点が異なります:

  • モジュールはインスタンス化できません
  • モジュールにはサブクラスがありません
  • モジュールは別のモジュールによってのみ定義できます

構文

module Identifier statement1 statement2 ........... end

モジュール定数の命名はクラス定数の命名と似ており、大文字で始まります。メソッド定義も似ています:モジュールメソッドの定義はクラスメソッドの定義と似ています。

クラスメソッドと同様に、メソッド名の前にモジュール名とピリオドを置くことでモジュールメソッドを呼び出すことができます。また、モジュール名とコロン2つ(::)を使用して定数を参照できます。

例

#!/usr/bin/ruby #trig.rb ファイルで定義されたモジュール module Trig PI = 3.141592654 def Trig.sin(x) # .. end def Trig.cos(x) # .. end end

同じ関数名でも機能が異なる複数のモジュールを定義できます:

例

#!/usr/bin/ruby #moral.rb ファイルで定義されたモジュール module Moral VERY_BAD = 0 BAD = 1 def Moral.sin(badness) # ... end end

クラスメソッドと同様に、モジュール内でメソッドを定義するとき、モジュール名の後にピリオド、その後にメソッド名を指定できます。

Ruby require文

require文は、C や C++ の include文、Java の import文に似ています。第三者のプログラムが定義済みのモジュールを使用したい場合、単に Ruby のrequire文を使用してモジュールファイルを読み込むことができます:

構文

構文

require filename

ここでは、ファイル拡張子は.rb必須ではありません。

例

$LOAD_PATH << '.' require 'trig.rb' require 'moral' y = Trig.sin(Trig::PI/4) wrongdoing = Moral.sin(Moral::VERY_BAD)

ここでは、次を使用します$LOAD_PATH << '.'これにより、Ruby は参照されたファイルを現在のディレクトリ内で検索する必要があることを認識します。$LOAD_PATH を使用したくない場合は、次を使用できますrequire_relativeを使用して、相対ディレクトリからファイルを参照します。

注意:ここでは、ファイルに同じ関数名が含まれています。そのため、呼び出しプログラムでコードの曖昧さが生じる可能性がありますが、モジュールはこの曖昧さを回避し、モジュール名を使用して適切な関数を呼び出すことができます。

Ruby include文

モジュールはクラスに組み込むことができます。クラスにモジュールを組み込むには、クラス内でinclude文を使用します:

構文

include modulename

モジュールが別のファイルで定義されている場合、モジュールを組み込む前にrequire文を使用してそのファイルを参照する必要があります。

例

次のモジュールがsupport.rbファイルに書かれているとします。

module Week FIRST_DAY = "Sunday" def Week.weeks_in_month puts "You have four weeks in a month" end def Week.weeks_in_year puts "You have 52 weeks in a year" end end

次に、クラス内でそのモジュールを次のように参照できます:

例

#!/usr/bin/ruby $LOAD_PATH << '.' require "support" class Decade include Week no_of_yrs=10 def no_of_months puts Week::FIRST_DAY number=10*12 puts number end end d1=Decade.new puts Week::FIRST_DAY Week.weeks_in_month Week.weeks_in_year d1.no_of_months

これにより、次の結果が得られます:

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 を詳しく理解しましょう:

例

module A def a1 end def a2 end end module B def b1 end def b2 end end class Sample include A include B def s1 end end samp=Sample.new samp.a1 samp.a2 samp.b1 samp.b2 samp.s1
  • モジュール A はメソッド a1 と a2 で構成されています。
  • モジュール B はメソッド b1 と b2 で構成されています。
  • クラス Sample はモジュール A と B を含みます。
  • クラス Sample は4つのメソッドすべて、すなわち a1、a2、b1、b2 にアクセスできます。
  • したがって、クラス Sample が2つのモジュールを継承していることがわかります。クラス Sample は多重継承または mixin 。

その他の拡張を使用していると言えます。