Ruby-modules
Ruby-モジュールとミックスイン
モジュールは、メソッド、クラス、および定数をまとめる方法です。 モジュールには、2つの大きな利点があります。
- モジュールは_namespace_を提供し、名前の衝突を防ぎます。
- モジュールは_mixin_機能を実装します。
モジュールは名前空間を定義します。名前空間は、他のメソッドや定数が踏まれることを心配せずにメソッドや定数を再生できるサンドボックスです。
構文
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
クラスメソッドのように、モジュールでメソッドを定義するときは常に、モジュール名の後にドットとメソッド名を続けて指定します。
Rubyのrequireステートメント
requireステートメントは、CおよびC ++のincludeステートメントおよびJavaのimportステートメントに似ています。 3番目のプログラムが定義済みのモジュールを使用する場合、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のミックスイン
このセクションを読む前に、オブジェクト指向の概念の知識があることを前提としています。
クラスが複数の親クラスから機能を継承できる場合、そのクラスは複数の継承を示すことになっています。
Rubyは複数の継承を直接サポートしていませんが、Rubyモジュールには別の素晴らしい用途があります。 一気に、それらは多重継承の必要性をほとんどなくし、_mixin_と呼ばれる機能を提供します。
ミックスインを使用すると、クラスに機能を追加するための素晴らしい制御方法が提供されます。 ただし、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は多重継承または_mixin_を示していると言えます。