"NARUSE, Yui" wrote:
> 成瀬です。
> 
> 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 のことを気にせず弄り回せるので、
> これはこれでメリットがあると思いますが、
> 原本を返したほうがいいという主張に切り替えます?

あー。[] はコピーを返していたのですか。
今書いているコードで、明示的に dup してたのですが、余計だったわけですね。

m = ['abcde', 'a', 'c', 'e']
m1 = m[1]

としたときとの類似性から、原本を返したほうがいいような気もしますが、
そうすると現行のコードへの影響が大きそうですので、この提案はひっこめます。