7.2 名前空間
モジュールは多重継承を解決するためだけの手段ではない。名前空間を与える役割もしている。 名前空間とは名前の衝突を避けるために分割するためのものである。 例えば同名のファイルを保存することができないためにディレクトリを作って分ける、これも名前空間と言える。 名前空間の例は以下の様なものである。
module ModuleA
OK = 1
def self.hoge(x)
x * 5
end
class Foo
end
end
module ModuleB
def self.hoge(x)
x - 5
end
class Foo
end
end
ModuleA::OK
=> 1
Math::PI
=> 3.141592653589793
ModuleA::hoge(10)
=> 50
ModuleB.hoge(10)
=> 5
ModuleA::Foo.new
ModuleB::Foo.new
Rubyにおいてモジュールは同名の変数、メソッド、クラスなどの衝突を避けるためにも使われる。 PIなどの意味のある値は単なる定数ではなくMathモジュールの定数として定義すると意味が伝わりやすくなるという意図もある。メソッドはモジュールの中で定義している(ミックスイン目的ではない)ことを明記するためにクラスメソッド同様にself.を明記しなければならないことに注意するように。 モジュールの中のものにアクセスするにはコロンを2つ(::)使用する。メソッドはドットを利用してもアクセスすることができる。