Rubyモジュール(モジュール)
モジュールは、メソッド、クラス、定数を組み合わせる方法です。モジュールには 2 つの大きな利点があります。
モジュールは namespace を提供し、名前の競合を回避します。
モジュールはmixinデバイスを実装します。
モジュールは、メソッドと定数が他の場所のメソッド定数と競合しない、サンドボックスに相当する名前空間を定義します。
モジュールはクラスに似ていますが、1 つの違いがあります:
モジュールはインスタンス化できません
モジュールにはサブクラスがありません
モジュールは別のモジュールによってのみ定義できます
構文
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 ステートメントを使用してモジュール ファイルをロードするだけです:
Syntax
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 ステートメントを使用できます。
Syntax
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 のミックスイン
このセクションを読む前に、オブジェクト指向の概念を予備的に理解する必要があります。 。
クラスが複数の親クラスからクラスの特性を継承できる場合、そのクラスは多重継承として表示されます。
Ruby は多重継承を直接サポートしていませんが、Ruby のモジュールには別の魔法の機能があります。 mixinと呼ばれるデバイスを提供することで、多重継承の必要性がほぼなくなります。
Ruby は実際には多重継承メカニズムを実装していませんが、代わりに 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 で構成されます。
クラスサンプルにはモジュールAとBが含まれています。
クラス サンプルは、4 つのメソッドすべて (a1、a2、b1、b2) にアクセスできます。
したがって、クラス Sample が 2 つのモジュールを継承していることがわかります。クラス Sample は多重継承または ミックスイン を使用していると言えます。