たけ(tk)です。

[ruby-list:38183] String << の動作につきまして にて 
kuto / d-itlab.co.jp さん 曰く:

> ruby 1.8.0 を使わせていただいております。
> 
> String の動作についてちょっと疑問があるので質問させてください。
> (もし重複した質問がすでにございましたらすみません)
> 
> ruby 1.8.0 (2003-08-04) [i386-cygwin]
> での動作です。
> 
> (1) % ruby -e "s = ARGV[0]; puts s.frozen?"
> false
> 
> (2) % ruby -e "s = ARGV[0]; s << 'hoge'; puts s" foo
> -e:1:in `<<': can't modify frozen string (TypeError)
>         from -e:1
> 
> (3) % ruby -e "s = ARGV[0]; s += 'hoge'; puts s" foo
> foohoge
> 
> --
> という動作になっているのですが、これは仕様でしょうか?
> 仕様とすればどういった意図だと解釈すればよろしいですか?
> ( (2) の部分の frozen string はどの部分なのかよく分かりません )

  これは「Rubyの冒険 旅立ち編」のp.204からp.216の10ページほどかけて説
明した「破壊的メソッド」と「オブジェクトの共有」の問題です。

 簡単に言うと、
 (1) s = ARGV[0]
の時点で、; puts s.frozen?"


take_tk = kumagai hidetake