成瀬です。

KISHIMOTO, Makoto wrote:
> きしもとです
> 
> MatchData の [] などが返す String についてなのですが、
> chop! などのような副作用のあるメソッドを呼ぶと、エラーに
> ならず変更できたかのように見えて変更されてないですが、
> freeze して(あるいは freeze されたかのような)、
> 変更しようとしたらエラーになるオブジェクトにするか、
> あるいは副作用による変更が可能なオブジェクトにするか、の
> どちらかのほうがいいのではないでしょうか?

とりあえず現状について説明しますと、
irb(main):001:0>m = "abcde".match(/(.)b(.)d(.)/)
=> #<MatchData "abcde" 1:"a" 2:"c" 3:"e">
irb(main):002:0> m1 = m[1]
=> "a"
irb(main):003:0> m1.chop!
=> ""
irb(main):004:0> m1
=> ""
irb(main):005:0> m[1]
=> "a"
という感じで、
つまり m[1] は中に保存している String のコピーを返しているのです。

取得元の MatchedData のことを気にせず弄り回せるので、
これはこれでメリットがあると思いますが、
原本を返したほうがいいという主張に切り替えます?

-- 
NARUSE, Yui  <naruse / airemix.jp>