English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Ruby モジュール(Module)

モジュール(Module)はメソッド、クラス、定数を組み合わせる方法です。モジュール(Module)はあなたに大きな利点を提供します。

  • モジュールは以下を提供します。命名空間と名前空間。

  • モジュールは以下を実現し、名前の衝突を避けます。 mixin 装置。

モジュール(Module)は名前空間を定義し、沙箱として機能し、その中のメソッドや定数は他の場所のメソッドや定数と衝突しません。

モジュールはクラスに似ていますが、以下の点で異なります:

  • モジュールはインスタンス化できません。

  • モジュールにはサブクラスがありません。

  • モジュールは他のモジュールによってのみ定義できます。

文法

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

クラスメソッドのように、モジュール内でメソッドを定義する場合、モジュール名の後に点号を付け、その後メソッド名を指定できます。

ここでは、ファイルには同じ関数名が含まれています。したがって、これは呼び出し先プログラムを参照する際にコードの曖昧さを引き起こしますが、モジュールはこのコードの曖昧さを避け、適切な関数を呼び出すためにモジュールの名前を使用できます。 require Ruby

require文はCとC++のinclude文に似ています。++ Javaのimport文と同様に、第三者のプログラムが定義されたモジュールを使用する場合は、Rubyのrequire文を使用できます。 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 require_relative

から相対ディレクトリを参照するために使用します。注意:

ここでは、ファイルには同じ関数名が含まれています。したがって、これは呼び出し先プログラムを参照する際にコードの曖昧さを引き起こしますが、モジュールはこのコードの曖昧さを避け、適切な関数を呼び出すためにモジュールの名前を使用できます。 include Ruby

クラスにモジュールを埋め込むために、クラス内で以下の文を使用できます。 include 文:

文法

include modulename

モジュールが別々のファイルで定義されている場合、モジュールをインクルードする前に require このファイルを参照するステートメント。

オンラインサンプル

以下のモジュールは、以下の場所に書かれていると仮定します。 support.rb ファイル中。

module Week
   FIRST_DAY = "日曜日"
   def Week.weeks_in_month
      puts "あなたは月に4週間あります"
   end
   def Week.weeks_in_year
      puts "あなたは 52 年間の週数"
   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

これにより以下の結果が得られます:

日曜日
あなたは月に4週間あります
あなたは 52 年間の週数
日曜日
120

RubyのMixins

このセクションを読む前に、面向オブジェクトの概念について基本的な理解が必要です。

クラスが複数の親クラスからクラスの特性を継承できる場合、そのクラスは多重継承と表示されます。

Rubyは直接多重継承をサポートしていませんが、Rubyのモジュール(Module)にはもう一つの魔法の機能があります。それは多重継承の必要性をほぼ取り除き、 mixin の装置。

Rubyは実際には多重継承メカニズムを実装していないため、mixin技術を代替品として採用しています。モジュールをクラス定義にincludeすると、モジュール内のメソッドがクラスにmixされます。

以下の例コードを見てみましょう、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 が 2つのモジュールを継承していることがわかります。多重継承と呼ぶこともできます。 mixin