Contents
Ruby – モジュールとミックスイン
モジュールとは何か?
モジュールは、メソッド、クラス、および定数をグループ化する方法です。モジュールは2つの大きなメリットをもたらします。
構文
module Identifier
statement1
statement2
...........
end
#モジュールは「module」から始まり「end」で終わりとなります。そしてモジュールにはモジュール名を指定します。
#モジュール名はモジュールを識別するための名前で大文字のアルファベットから始まります
例
#!/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
Ruby require
requireステートメントは、CおよびC ++のインクルードステートメントとJavaのインポートステートメントに非常に似ています。
構文
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の理解を得るために、以下のサンプルコードを調べてみましょう。
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は、a1、a2、b1、およびb2の4つのメソッドすべてにアクセスできます。したがって、クラスSampleは両方のモジュールから継承していることがわかります。したがって、Sampleというクラスは、複数の継承またはmixinを示しています。
前のページ
次のページ