Rubyの定数は定数ではない

Rubyの定数(大文字で始まる変数)は再代入が可能です。警告は出ますが変更できます。

FOO = "hello"
FOO = "world"
p FOO

結果:

temp.rb:2: warning: already initialized constant FOO
"world"

RubyにはC/C++のような定数は存在せず、大文字で始まる変数は「クラスに属し、Foo::Barのように外から値を取り出せる変数」であると思われます(トップレベルの定数はObjectに属します)。

「大文字で始まる変数は定数」というより、「大文字で始まる変数はおもに定数として使われている」が正確なところでしょうか。

大文字で始まる変数は「クラス変数」と呼んでもよさそうに思いますが、@@fooのように「クラスとインスタンスの内部で共有される変数」が「クラス変数」と呼ばれています。

1999年のメーリングリストアーカイブで定数についてのまつもと氏の考えが読めます。