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 #=> "メッセージ"