From: "NARUSE, Yui" Date: 2009-01-27T22:12:33+09:00 Subject: [ruby-dev:37842] Re: MatchData#[] などが返す String 成瀬です。 KISHIMOTO, Makoto wrote: > きしもとです > > MatchData の [] などが返す String についてなのですが、 > chop! などのような副作用のあるメソッドを呼ぶと、エラーに > ならず変更できたかのように見えて変更されてないですが、 > freeze して(あるいは freeze されたかのような)、 > 変更しようとしたらエラーになるオブジェクトにするか、 > あるいは副作用による変更が可能なオブジェクトにするか、の > どちらかのほうがいいのではないでしょうか? とりあえず現状について説明しますと、 irb(main):001:0>m = "abcde".match(/(.)b(.)d(.)/) => # 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