定数の扱い方

ネタ元は、ruby-listの43802から始まるスレッド。恥ずかしながら、僕もこの話に引っかかった。Rubyは定数を大文字で表すのだが、gsub!で変更できてしまうのはおかしいんじゃないってこと。実際やってみると、

lion.local{miyohide}% irb [~]
irb(main):001:0> TESTSTRING="apple orange"
=> "apple orange"
irb(main):002:0> TESTSTRING.gsub!('apple','banana')
=> "banana orange"
irb(main):003:0>

と、変更できてしまう。ただ、これは動作としては正常で、

定数はポインタの書き換えを許さないだけで、その先の中身まで保護しません

ってことだそうだ。中身まで保護するためには、freezeを使えばよくて、

irb(main):003:0> TESTSTRING.freeze
=> "banana orange"
irb(main):004:0> TESTSTRING.gsub!('orange','banana')
TypeError: can't modify frozen string
from (irb):4:in `gsub!'
from (irb):4
from :0
irb(main):005:0>

でよい。勉強になった。