Rubyの定数は定数ではない
Rubyの定数(大文字で始まる変数)は再代入が可能です。警告は出ますが変更できます。
FOO = "hello" FOO = "world" p FOO
結果:
temp.rb:2: warning: already initialized constant FOO "world"
RubyにはC/C++のような定数は存在せず、大文字で始まる変数は「クラスに属し、Foo::Barのように外から値を取り出せる変数」であると思われます(トップレベルの定数はObjectに属します)。
「大文字で始まる変数は定数」というより、「大文字で始まる変数はおもに定数として使われている」が正確なところでしょうか。
大文字で始まる変数は「クラス変数」と呼んでもよさそうに思いますが、@@fooのように「クラスとインスタンスの内部で共有される変数」が「クラス変数」と呼ばれています。