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 は多重継承または ミックスイン を使用していると言えます。