◆定数には再代入可能(怒られるけど)。
irb(main):001:0> HOGE = 'abc'
=> "abc"
irb(main):002:0> HOGE = 'xyz'
(irb):2: warning: already initialized constant HOGE
(irb):1: warning: previous definition of HOGE was here
=> "xyz"
irb(main):003:0> HOGE
=> "xyz"
◆書き換えは普通にできる。怒られない。
$ irb
irb(main):001:0> HOGE = 'abc'
=> "abc"
irb(main):002:0> HOGE[0] = 'x'
=> "x"
irb(main):003:0> HOGE
=> "xbc"
◆freeze すれば、書き換えできなくなる。
$ irb
irb(main):001:0> HOGE = 'abc'.freeze
=> "abc"
irb(main):002:0> HOGE[0] = 'x'
RuntimeError: can't modify frozen String
from (irb):2:in `[]='
from (irb):2
from /Users/masutaka/.rbenv/versions/2.1.6/bin/irb:11:in `<main>'
irb(main):003:0> HOGE
=> "abc"
◆ただし、再代入は可能。
$ irb
irb(main):001:0> HOGE = 'abc'.freeze
=> "abc"
irb(main):002:0> HOGE = 'xyz'
(irb):2: warning: already initialized constant HOGE
(irb):1: warning: previous definition of HOGE was here
=> "xyz"
irb(main):003:0> HOGE
=> "xyz"
C言語のポインタを想像すると、素直な挙動だと思った。