DesignAssembler

備忘録に近い

Rubyの定数

メタプログラミングRubyを読んでます。

定数

大文字で始まる参照は、クラス名やモジュール名も含めて全て定数です。

定数はディレクトリの階層のような木構造で並んでいるので、MyModule::MyClass::MyConstantのようにパスを使って指定します。

外部の定数を指定するには、コロン2つ「::」で書き始めます。

これはまさしくディレクトリの構造と近く、ルートディレクトリの指定に「/」を使うのと同じです。

さらに、Moduleクラスはconstants()という名前のインスタンスメソッドとクラスメソッドを提供しています。これは「ls」コマンドのようなものです。

module PracticeModule
  class PracticeClass1
    CONSTANCE1 = "定数1"
  end

  class PracticeClass2
    CONSTANCE1 = ::PracticeModule::PracticeClass1::CONSTANCE1
    CONSTANCE2 = "定数2"
  end
end

#irb
> PracticeModule::PracticeClass1::CONSTANCE1
 => “定数1"
> PracticeModule::PracticeClass2::CONSTANCE1
 => “定数1"
> PracticeModule::PracticeClass2::CONSTANCE2
 => “定数2"

また、モジュール名もクラス名も定数としての区別がないのでモジュール名とクラス名で衝突することがあります。

参考

メタプログラミングRuby

メタプログラミングRuby 第2版

メタプログラミングRuby 第2版