まつもと ゆきひろ@トヨタケーラムです.

ちょっと間が空きましたが,「定数」についてです.
# 持ち歩けるマシンが無いとつらい….
--
クラス定数

次は定数だ.定数は大文字のアルファベットで始まる名前で指定さ
れる.定数は代入によって定義される.未初期化の定数のアクセス
や既に定義された定数への代入はエラーになる.

 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, CONST2, CONST3, "\n"
 ruby|   def const_test
 ruby|     print CONST3, CONST2, CONST1, CONST3, "\n"
 ruby|   end
 ruby| end
 135
 ConstTest
 ruby> include ConstTest # includeすれば定数を参照できる
 nil
 ruby> CONST1
 1
 ruby> CONST1 = 9	 # 先祖の定数は再定義できる(しない方が良い)
 9
 ruby> const_test	 # しかし,先祖の定数には影響しない
 531

あるクラスで定義された定数は`::'演算子を使って参照できる.

 ruby> ConstTest::CONST1
 1

しかし,`::'演算子を使った代入はできない

 ruby> ConstTest::CONST1 = 7
 ERR: syntax error in eval():
 (eval):1: parse error

それと`::'演算子ではそのクラスまたはモジュールで定義された定
数しか,参照できない.上の例ではConstTestモジュールに対して
`::'を使うと定数,CONST1,CONST2,CONST3は参照できるが,
ConstTestをincludeしたクラスであるObjectに対して`::'でCONST2,
CONST3をアクセスできない(CONST1は再定義しているので参照でき
るのだが).