Ruby-モジュールとミックスイン

モジュールは、メソッド、クラス、および定数をグループ化する方法です。モジュールには2つの大きな利点があります。

  • モジュールは名前空間を提供し、名前の衝突を防ぎます

  • モジュールはミックスイン機能を実装します。

モジュールは名前空間を定義します。これは、他のメソッドや定数に踏まれることを心配することなく、メソッドや定数を再生できるサンドボックスです。

構文

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

モジュール定数は、クラス定数と同じように名前が付けられ、最初に大文字が付けられます。メソッド定義も同様に見えます。モジュールメソッドは、クラスメソッドと同じように定義されます。

クラスメソッドと同様に、モジュールメソッドの名前の前にモジュールの名前とピリオドを付けてモジュールメソッドを呼び出し、モジュール名と2つのコロンを使用して定数を参照します。

#!/usr/bin/ruby

# Module defined in trig.rb file

module Trig
   PI = 3.141592654
   def Trig.sin(x)
   # ..
   end
   def Trig.cos(x)
   # ..
   end
end

同じ関数名で機能が異なるモジュールをもう1つ定義できます-

#!/usr/bin/ruby

# Module defined in moral.rb file

module Moral
   VERY_BAD = 0
   BAD = 1
   def Moral.sin(badness)
   # ...
   end
end

クラスメソッドと同様に、モジュールでメソッドを定義するときは常に、モジュール名、ドット、メソッド名の順に指定します。

Rubyrequireステートメント

requireステートメントは、CおよびC ++のincludeステートメントとJavaのimportステートメントに似ています。3番目のプログラムが定義済みのモジュールを使用する場合は、Rubyrequireステートメントを使用してモジュールファイルをロードするだけです。

構文

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 相対ディレクトリのファイルを含める。

IMPORTANT−ここでは、両方のファイルに同じ関数名が含まれています。したがって、これにより、プログラムの呼び出しに含めるときにコードのあいまいさが生じますが、モジュールはこのコードのあいまいさを回避し、モジュール名を使用して適切な関数を呼び出すことができます。

Rubyincludeステートメント

モジュールをクラスに埋め込むことができます。モジュールをクラスに埋め込むには、クラスで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のミックスイン

このセクションを通過する前に、オブジェクト指向の概念についての知識があることを前提としています。

クラスが複数の親クラスから機能を継承できる場合、そのクラスは多重継承を示すことになっています。

Rubyは多重継承を直接サポートしていませんが、Rubyモジュールには別の素晴らしい用途があります。一気に、それらは多重継承の必要性をほとんど排除し、ミックスインと呼ばれる機能を提供します。

Mixinは、クラスに機能を追加するための見事に制御された方法を提供します。ただし、ミックスイン内のコードがそれを使用するクラス内のコードと相互作用し始めると、それらの真の力が発揮されます。

次のサンプルコードを調べて、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が両方のモジュールから継承していることがわかります。したがって、クラスSampleは多重継承またはミックスインを示していると言えます。