Rubyのモジュールの特徴(クラスとの違いなど)

Rubyにはプログラムを柔軟に記述するためにモジュールというクラスに似た機能が用意されています。モジュールの特徴やクラスとの違い、使い方についてみていきます。

モジュールとは

モジュールはクラスと同じように定数やメソッドをまとめたり、クラスに組み込むことで継承などができる便利な機能です。

定数

例えば定数を定義する場合、次の使い方ができます。

module Mod
  Message = "モジュール"
end
Mod::Version #=> "モジュール"

インスタンスメソッド

インスタンスメソッドは定義するだけでは呼び出すことができず、module_functionメソッドを使う必要がります。

module Mod
  def msg
    puts "メッセージ"
  end
  module_function :msg
end
Mod.msg #=> "メッセージ"

クラスメソッド

モジュール内で宣言されたクラスメソッドは、クラスと同様にモジュールから直接呼び出すことができます。ただしモジュールを拡張したクラス内でincludeやextendで呼び出すことができません。

module Mod
  def self.msg
    puts "メッセージ"
  end
end
Mod.msg #=> "メッセージ"

クラスとの違い

上記の通り、モジュールは一見クラスと似ています。しかし、クラスはデータと処理をひとまとめにしているのに対し、モジュールは「処理」のみをまとめたものという特徴があります。
違いは次の2点です。

  • モジュールはインスタンスを作れない
  • モジュールは継承できない

クラスに組み込み継承(include・extend)

モジュールはクラスに組み込んで使うことができます。includeやextendすることをMix-inといい、クラス処理をモジュールに切り出すことで、クラスの肥大化を防いだり同じ処理の繰り返しを防ぐことができます。

include

includeは対象のクラスにincludeしたモジュールのメソッドを、インスタンスメソッドとして使うことができるようになります。クラスをnewで作成したインスタンスから呼び出すことができます。

module Mod
  def msg
    puts "メッセージ"
  end
end
class Inc
  include Mod
end
inc = Inc.new
inc.msg #=> "メッセージ"

extend

extendは対象のクラスにextendしたモジュールのメソッドを、クラスメソッドとして使うことができるようになります。

module Mod
  def msg
    puts "メッセージ"
  end
end
class Inc
  extend Mod
end
Inc.msg #=> "メッセージ"