西@九大です。
多分、ruby-dev だと思いますが、話の流れ的に、勢いに乗って。。。

From: gotoken / math.sci.hokudai.ac.jp (GOTO Kentaro)
> はary.grep(...){|str| .... } と書けますよね。あ、返す値が違
> うか(grep はブロックを与えられるとレシーバを返す)。

これに関してですが、ブロックが与えられた場合は、「ブロックを評価した値
の配列」を返してくれる方が嬉しい、と常々感じていました。(grep + collect
的な機能を意図)

というのも、ブロック付きで呼び出された時は、その配列に対する処理はそこ
で完結している場合が多く、そこからさらに、元の要素の配列を返り値として
欲しいという事は殆どないからです。(さらに実行したい命令があるなら、ブ
ロックの中に入れておくか、最初から collect などを使うであろうから)

むしろ、ブロック付きで呼び出された場合は、ブロック中で利用したオブジェ
クトをブロック外部に持ち出したい、という要求の方が高く、その方が利便性
が高いと思います。しかしながら、現在の grep の仕様では、

  * 先に空配列を宣言して、grep(collect) のブロック内で push していく。
  * grep().collect{} とやる。
  * collect{}.compact。collect 内部で grep 相当の動作を行い、マッチし
    なければ nil を返し、さらに compact する。

などとやるしかなく、結局「加工した要素が欲しいなら collect 使っとけ!」
「配列が欲しいなら、find_all 使っとけ!」みたいな「grep 離れ」に繋がる
気がします。実際、grep が使われるコードはあまり見かけないですし。

極論すれば、find_all や collect と性質が被っている以上、grep は「ブロッ
ク付き、かつ、最後に評価した値の配列を返す」という利用法&仕様でしか殆
ど存在価値がない!とまで言っちゃいましょう。(言い過ぎ)

少くとも、「ブロック付き」かつ「返り値(self)をさらに利用」という使われ
方はしてないと思います。もし、「あ、私、そんな風に使ってます」という方
が一人でもいらっしゃれば、今回の提案は取り下げます。(かなり強気)

という事で、どうでしょうか?秘かに「とりあえず、self を返してるだけ」
という仕様である事を期待しています。まあ、最悪、最後に引数を評価すれば、
現在の仕様と互換になる事ですし。(ちょっと弱気になったらしい)

効果的な KEM(Killer Example to Matz)が思いつきませんが、大旨下記のよう
に使えるようになると、大変便利だと思っています。
  * values = data_array .grep(/=/) {$'}
  * values = web_form_array .grep(/xxx/) {|item| CGI::unescape(item)}

------------------------------------------------------------------
九州大学大学院システム情報科学研究科 情報工学専攻 博士後期課程三年
      西 和則   ( e-mail: kazunori / swlab.csce.kyushu-u.ac.jp )
------------------------------------------------------------------