From: Yusuke ENDOH Date: 2008-02-01T12:21:14+09:00 Subject: [ruby-dev:33556] Re: block parameter of String#gsub 遠藤と申します。 08/02/01 に NARUSE, Yui さんは書きました: > > |気になるのは互換性ですが m.to_s は 今までの $& と一致するので、 > > |"abcdefg".gsub(/(.).(.)/){|m| m+","} はさすがにエラーが出ますが、 > > |"abcdefg".gsub(/(.).(.)/){|m| "%s," % m} なら今まで通り動きますし、 > > |そもそもおそらくほとんどの現在のコードは、 > > |"abcdefg".gsub(/(.).(.)/){$&+","} でしょう。 それを言っちゃうと、MatchData がほしいときの現在のコードだって "abcdefg".gsub(/(.).(.)/){$1+","+$2} なので、仕様を変える理由としては弱いと思いました。 問題はやはり元のスレッドにあったように、scan と gsub のブロック パラメータが異なっていてわかりにくい点だと思います。どうせ仕様を 変えるならば MatchData にそろえちゃおう、というのは賛成です。 > > 私が考えていた(けど、1.9.0には間に合わなかった)アイディアは、 > > subに対応するs、gsubに対応するsg(またはgs)メソッドをStringク > > ラスに新設し、こちらではMatchDataを与えるというものです。 > > おぉ、それはいいと思います。 > String#scan のブロックパラメータの MatchData版も併せてほしいですね。 > s, sg, sc だとそこはかとなく共通性もある・・・かも。 脊髄反射で「記号化しすぎ」と反対したくなりましたが、それ以外の 反対理由は思いつきませんでした。逆に賛成理由は - unix 文化では「s 一文字 = 置換」というコンセンサスがあるかも - String のインスタンスメソッドだからグローバルには影響がない - 元の sub や gsub だって名前を見ただけじゃ意味がわからない - 非互換ではなく新機能なので今からでも堂々とやれる と、いっぱい思いつきました。 とはいえ、Perl がいやで Ruby ユーザになった人々 (含む私) は過剰な 記号化には抵抗があると思います。 私の印象は、「gsub が二文字になる価値はあるかも知れないけど sub が 一文字になるほどの価値は感じない」という感じです。 -- Yusuke ENDOH