導入
第8章で include によるMix-inを学びましたが、モジュールにはもう一つ大事な役割があります。関連するクラスをひとまとめにして名前の衝突を防ぐ「名前空間(ネームスペース)」です。大きなプログラムやライブラリで必ず使われます。
説明
module 名前 ... end の中にクラスを定義すると、外からは モジュール名::クラス名 で呼び出します。:: は「〜の中の」という意味です。
module Zoo
class Lion
def roar
"ガオー"
end
end
end
lion = Zoo::Lion.new
puts lion.roar # ガオー
なぜ便利かというと、同じ Lion という名前でも、別のモジュールに入れればまったく別のクラスとして共存できるからです。
module Zoo
class Cat
def sound
"ライオンの仲間"
end
end
end
module House
class Cat
def sound
"ニャー"
end
end
end
puts Zoo::Cat.new.sound # ライオンの仲間
puts House::Cat.new.sound # ニャー
Ruby on Rails などの大きなライブラリは、この名前空間でクラスを整理しています。「機能のまとまりごとにモジュールで包む」のが、規模が大きくなっても崩れない設計の基本です。
やってみよう
Zoo に別のクラスを足したり、2つのモジュールに同じ名前のクラスを作って、:: で呼び分けられることを確かめましょう。
演習
モジュール Shop の中にクラス Item を定義してください。Item は initialize(n) で名前を受け取り、label メソッドで "商品:名前" を返します。Shop::Item.new("本").label を puts で表示してください(商品:本 になります)。
ヒント1を見る
module Shop の中に class Item ... end を書き、外から Shop::Item.new(...) で呼びます。
ヒント2を見る
def label; "商品:#{@n}"; end のように @n を埋め込みます。