次は定数だ.定数は大文字のアルファベットで始まる名前で指定さ れる.定数は代入によって定義される.未初期化の定数のアクセス や既に定義された定数への代入はエラーになる.
ruby> FOO ERR: Uninitialized constant FOO ruby> FOO = 5 5 ruby> FOO 5 ruby> FOO = 5 ERR: already initialized constnant FOO
定数はクラス/モジュールスコープで参照できる.別な言い方をす れば,クラスやモジュールの定義の範囲中ではそのクラス(または 親クラスやincludeされているモジュール)に所属する定数が参照で きる.クラスやモジュールの定義の外ではObjectクラスの定数が参 照できる.
ruby> module ConstTest ruby| CONST1 = 1 ruby| CONST2 = 3 ruby| CONST3 = 5 ruby| print CONST1, CONST2, CONST3, "\n" ruby| def const_test ruby| print CONST3, CONST2, CONST1, "\n" ruby| end ruby| end 135 nil ruby> include ConstTest # includeすれば定数を参照できる Object ruby> CONST1 1 ruby> CONST1 = 9 # 先祖の定数は再定義できる(しない方が良い) 9 ruby> const_test # しかし,先祖の定数には影響しない 531
あるクラスで定義された定数は`::'演算子を使って参照できる.
ruby> ConstTest::CONST1 1
しかし,`::'演算子を使った代入はできない
ruby> ConstTest::CONST1 = 7 ERR: compile error in eval(): eval.rb:33: parse error ConstTest::CONST1 = 7 ^
それと`::'演算子ではそのクラスまたはモジュールで定義された定 数しか,参照できない.上の例ではConstTestモジュールに対して `::'を使うと定数,CONST1,CONST2,CONST3は参照できるが, ConstTestをincludeしたクラスであるObjectに対して`::'でCONST2, CONST3をアクセスできない(CONST1は再定義しているので参照でき るのだが).