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