Effective Ruby勉強メモです。
Rubyで大きなアプリケーションなどを作る場合には、どうしても既存クラスと同じ名前のクラスを定義したいときがあります。
以下のように書くとクラスを新しく定義しているかのように見えますが、実際には既存のArrayクラスを再オープンしてメソッドを追加してるだけにすぎません。
Rubyではクラスはミュータブル(可変)なのです。
class Array def print_first p first end end
これでは思わぬ副作用をもたらしてしまいます。最悪、メソッドを完全に上書きしてしまいシステム全体に不具合が生じてしまいます。
そこで、新しくモジュールを定義し、その中でクラス定義をすることで既存のクラスと同じ名前の異なるクラスを定義することができます。これは名前空間と言われるテクニックです。
module Demo class Array def print_first p "first" end end end a = Demo::Array.new a.print_first #=> "first"
呼び出す際はDemo::Array
のようにモジュールを明示的に書くのが望ましいです。
呼び出すときにRubyがどのように定数を探すのかは後述します。
続きを読む