1. はじめに
Ruby を学んでいて「モジュールって何?クラスやライブラリと何が違うの?」と混乱しました。
違いと使い分けを整理してまとめてみました。
※Rubyの仕様に基づいています。
2. モジュールの持つ2つの役割
1) 名前空間(Namespace)として使う
他と名前が衝突しないよう グループ化 する枠。
イメージとしては「フォルダ分け」のようなもの。
title.rb
module Animals
class Dog
def bark
'わんわん'
end
end
end
dog = Animals::Dog.new
puts dog.bark # => わんわん
Animals::Dog
のように スコープ演算子 ::
でアクセスします。
2) Mixin(継承を使わず機能を共有)として使う
モジュールを使うと、共通の機能を複数のクラスに簡単に組み込めます。
これを「Mixin(ミックスイン)」と呼びます。
Rubyでは、
• include → インスタンスメソッドとして取り込む
• extend → クラスメソッドとして取り込む
という2種類の使い方があります。
mixin.rb
module Walkable
def walk
'てくてく歩く'
end
end
class Dog
include Walkable # ⇒ インスタンスメソッドになる
end
class Robot
extend Walkable # ⇒ クラスメソッドになる
end
puts Dog.new.walk # => てくてく歩く
puts Robot.walk # => てくてく歩く
3. クラス・モジュール・ライブラリの違い
概念 | 役割 | インスタンス化 (new ) |
---|---|---|
クラス | オブジェクトの設計図(状態+振る舞い) | 〇 |
モジュール | 名前空間 or 機能の束 | ✕ |
ライブラリ / Gem | 再利用するコードの集合体(クラスやモジュールを含む) | △(呼び出して使う) |
補足: モジュールにも定数は置けますが、インスタンス変数を持つ用途には向いていません。ライブラリ自体はインスタンス化しませんが、ライブラリ内のクラスからインスタンス化することはあります。
4. まとめ
- モジュール … 名前空間 & 機能の箱(Mixin)
- クラス … 状態+振る舞いを持つ設計図
- ライブラリ … クラス/モジュールを束ねた再利用パッケージ