From: matz@... (Yukihiro Matsumoto) Date: 2000-02-03T00:50:58+09:00 Subject: [ruby-dev:9062] Re: bang method returns string always まつもと ゆきひろです In message "[ruby-dev:9060] Re: bang method returns string always" on 00/02/03, WATANABE Hirofumi writes: |: begin s.sub!(/(.*\d)(\d\d\d)/, '\1,\2') end while $& |: |:とか |: |: while (s.sub!(/(.*\d)(\d\d\d)/, '\1,\2'); $&); end |: |:ちょっと苦しい(後者の方がマシ?)。gsub!だとダメなところが微妙。 | |わたしの好みは前者だけど if の場合は後者にせざるを得ないですね. さっき while s.sub!(/(.*\d)(\d\d\d)/, '\1,\2') && $&; end ってワザを思い付きました。これなら変化は最小か。 |ちらっと見たら parsedate.rb と shellwords.rb がそうです. そうか、修正しないと。 |それより tr! とかはどうするの? そう、sub!/gsub!のようにパターンマッチを含むものは $~ 系を使 えるので逃げられるのですが、chop!/chomp!/tr!/... のようなも のは変化の有無をチェックできなくなりますね。 (1) tr!などは変化しないときnilを返すように戻す (2) 変化の有無が知りたいときはno bang methodを使い、 original と比較する などの方法が考えられますね。私としては後者を勧めたい。