From: "古川大輔" Date: 2007-08-03T06:48:02+09:00 Subject: [ruby-list:43802] Re: gsub! で定数を書き換えられてしまう 皆様ありがとうございます。 $ irb irb(main):001:0> TESTSTR="apple orange" => "apple orange" irb(main):002:0> TESTSTR.gsub!('apple','banana') => "banana orange" irb(main):003:0> TESTSTR.freeze => "banana orange" irb(main):004:0> TESTSTR.gsub!('orange','banana') TypeError: can't modify frozen string from (irb):4:in `gsub!' from (irb):4 from :0 ということですね。どうもありがとうございました。 /mogya --- Hiroyuki Iwatsuki wrote: > 岩月と申します。 > > 定数というのはあくまでオブジェクトの器の話で、 > 二回目以降の代入の際に警告される変数と考えていいと思い ます。 > > foo = 1 > foo = 2 #これはOK > FOO = 1 > FOO = 2 # 警告が出る > > ですので、定数に代入したオブジェクトそのものと、 > 変数に代入したオブジェクトそのものは同じ扱いです。 > > オブジェクトそのものを書き換え禁止にするには > Object#freezeを使います。 > > FOO = "hello" > FOO.freeze # > 定数FOOではなく、"hello"というオブジェクトに対する操作 > FOO.gsub!(/hello/, 'bye') # 例外 TypeError > が発生する > > ただし、この場合にも定数には新たにオブジェクトを > 代入できますので注意してください。 > > FOO = "hello".freeze > FOO.gsub!(/hello/, 'bye') # 例外 TypeError > が発生する > FOO = "bye" # 警告は出るが、代入は行われる > > -- > IWATSUKI Hiroyuki > >