モジュールと名前空間
モジュールには名前空間を分けて、名前の衝突を防ぐ機能がある。
例えば、「ポイント履歴」と「活動履歴」という意味で2つのHistoryクラスが作成されたとする。
class History def initialize(payment, used_point, user_id) @payment = payment @used_point = used_point @user_id = user_id end end
class History def initialize(action, user_id) @action = action @user_id = user_id end end
この状態で、Historyクラスからインスタンスを生成しようにもどっちのHistoryなのか判断できない。そこで、moduleを使って名前空間を分ける。以下のようにすると、名前の衝突はなくなる。
module Point class History def initialize(payment, used_point, user_id) @payment = payment @used_point = used_point @user_id = user_id end end end
module Action class History def initialize(action, user_id) @action = action @user_id = user_id end end end
モジュールに属すクラスを生成するときは「モジュール名::クラス名」で生成。
Point::History.new(payment, 20, 101) Action::History.new("buy", 101)
より大きなプロジェクトでは、単に衝突だけではなく、グループやカテゴリーを分けるのにも使われる。例えば以下は「ActiveRecordディレクトリのAssociationsディレクトリのAliasTrackerクラス」を意味している。
module ActiveRecord module Associations class AliasTracker ・・・・