本文へスキップ
BecomeCoder

Rubyコース · 第9章 実務のRuby ― 記法を深める · レッスン40

名前空間 ― モジュールでまとめる

ブラウザで完結

導入

第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 を定義してください。Iteminitialize(n) で名前を受け取り、label メソッドで "商品:名前" を返します。Shop::Item.new("本").labelputs で表示してください(商品:本 になります)。

ヒント1を見る

module Shop の中に class Item ... end を書き、外から Shop::Item.new(...) で呼びます。

ヒント2を見る

def label; "商品:#{@n}"; end のように @n埋め込みます。

実際に動かしてみよう

下のエディタにRubyを書いて「実行」を押すと、学習用シミュレータが puts / print / p の出力を表示します(本物のRubyではなく、教材の範囲を再現した軽量な自作エンジンです)。配列・ハッシュ・ブロック(each/map/select)・メソッド・クラス・モジュール・例外なども動きます。本文の例を書き換えて動かしてみましょう(gem・Rails・ファイル入出力など一部の機能は対象外です。文字列を伸ばすときは str << も可能ですが、変数に反映されるのは str += です)。

Ruby — ブラウザ内で実行(学習用シミュレータ)

Rubyの教材サブセットを動かす学習用シミュレータを読み込みます(本物のRubyではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。