Rubyのmoduleの使い方とメリットを理解して脱初心者!

プログラミング
Rubyの機能であるmoduleについて解説します。特にclassとの違いが分からない場合は読んでおくようにしましょう。初心者にもわかりやすくサンプルを用いていますので、自身で動かしてみるなどして学習することで理解を広げることができます。
Rubyのmoduleの使い方とメリットを理解して脱初心者!

Rubyには独自の機能がありmoduleもそのうちの一つです。Rubyを習い始めている場合はmoduleの使い方とメリットを理解するところから始めていきましょう。moduleとは?moduleのメリットや使い方を解説していきます。

Rubyのmoduleとは?

moduleは日本語にすると「部品の集まり」や「区分」という意味になります。Rubyのmoduleはclassと同じようにmodule内に関数の定義ができること、プログラム上での役割や振る舞いをまとめることができます。

classとの違いは?

classと同じようなモノと勘違いしてしまうかもしれませんが、明確な違いが2つあります。
1つは、moduleからインスタンスが生成できないこと。もう一つは、moduleは継承できないことが挙げられます。

moduleを使うメリット

moduleを使うメリットは4つありますので、それぞれ見ていきましょう。

名前空間としての利用

たとえば下記のようなプログラムがあったとします。

module Car
  class SuperCar
    def self.introduce
      puts "This is SuperCar"
    end
  end
end

class SuperCar
  def self.introduce
    puts "これはスーパーカーです"
  end
end
 
Car::SuperCar.introduce 
SuperCar.introduce

このサンプルコードではmodule名とclass名が同名であり、メソッド名も同名になっています。このサンプルコードでは動かないように感じてしまうかもしれませんが、moduleは名前空間としての役割も持っているのでコンパイル上では別のものとして認識されます。

上記サンプルコードの結果は「This is SuperCar」「これはスーパーカーです」と表示されるようになります。大規模なプログラムを構築するにあたり、同名のメソッドが出てくるかもしれませんがmoduleを名前空間として利用することで衝突を避けさせることができます。

インスタンスメソッドとしての利用

Ruby独自の機能にMix-inがあります。Mix-inとはclassにmoduleの機能を混ぜ合わせることを指します。Mix-inをすることでモジュール内のメソッドをインスタンスメソッドとして利用することができるのです。下記のサンプルコードを見てみましょう。

module Lion
  def cryLion
    puts "ガオー!"
  end
end
 
module Cat
  def cryCat
    puts "ニャー"
  end
end
 
class Animal
  include Lion, Cat
end

obj = Animal.new

obj.cryLion
obj.cryCat

Animalクラス内にそれぞれのモジュールをincludeし、それぞれのメソッドを呼び出せるようになりました。複数のmoduleを上手に活用することで効率の良いプログラミングが可能となります。

extendとしての利用

extendを利用することで定義だけでなく、動的な拡張をすることも可能です。

module Human
  def introduce
    puts "私は人間です"
  end
end
 
obj = Object.new
obj.extend Human
obj.introduce

空のオブジェクトを生成し、extendで拡張しました。includeでの拡張は静的であるのに対し、動的に対応できるのでプログラムの柔軟性が増します。

すでにあるmoduleの利用

Rubyにはすでに用意されているmoduleが存在します。Fileに関するmoduleのFile::ConstantsやFileTest、数学関数のサポートをしているMathなどがあります。

Rubyのバージョンにより差異はありますが、用意されているmoduleはプログラムの安定性や使いやすさの点において優れています。自身で作成する手間も省けますので効率よく開発をすることが可能です。

moduleの使い方

メリットの項目でサンプルコードを記述しましたが、改めてmoduleの使い方を解説していきます。

moduleを作成

moduleの作成の仕方は下記となります。

module xxxx
end

xxxxの部分に指定のモジュール名を入れてください。関数を入れたい場合はmoduleの宣言部分とendの間に関数定義を入れることで作成されます。

moduleを関数のように使う

moduleを関数のように使いたい場合は下記のように書くことで対応できます。

module Calc
  def multi(x, y)
      return x * y
  end
  def divide(x, y)
      return x / y
  end

  module_function :multi
  module_function :divide
end

puts(Calc.multi(10,5))
puts(Calc.divide(10,5))

結果は「50 2」と続けて表示されるようになります。ポイントはmodule内にmodule_function :xxxと記入することです。
こうすることでサンプルコードのように関数としての対応が可能となります。

moduleをincludeして使う

classにincludeすることで使用することも可能です。

module Calc
  def multi(x, y)
      return x * y
  end
  def divide(x, y)
      return x / y
  end
end

class Test
  include Calc
end

test = Test.new
puts(test.multi(10,5))
puts(test.divide(10,5))

表示は「50 2」となります。TestクラスにCalcモジュールをインクルードしたことでCalcモジュールの関数を使用することができるようになりました。

クラス内でmoduleを使うには

クラス内でのmoduleの使用方法は下記のようになります。

module Calc
  def multi(x, y)
      return x * y
  end
end

class Test
  include Calc

  def calc(x, y)
      puts(multi(x,y))
  end
end

test = Test.new
test.calc(10,2)

表示結果は20となります。クラス内でもmoduleは通常のコードのように使用できますので、振る舞いに応じて対応してみましょう。

Rubyのmoduleを理解して効率よいプログラムを書こう!

Rubyのmoduleを理解することで効率よいプログラムが書けるようになります。業務でもよく使われることから、メリットや使い方を理解するようにしましょう。


この記事のキーワードに関する勉強会・イベントを探す

TECH PLAYでは、ITエンジニア向けの勉強会・イベント情報を提供しています。興味のある方はぜひご参加ください。


おすすめのコラム