西@九大です。
#ruby-list から持ってきました

From: matz / netlab.co.jp (Yukihiro Matsumoto)
> grepがブロック付きで呼ばれた場合のブロックの値はあくまでも真
> 偽値であり、それが真であった場合の値を集めると言う発想はあり
> ませんでした。

単に、その「あくまでも真偽値」だった従来の仕様を変更して、「最後に評価
した値 + compact」にして欲しい、という提案を意図しています。今、気付き
ましたが、grep(pat).collect{} というより、collect{}.compact ですね。

> も賛同しますが、真偽値の真にそれ以上の意味を与えても良いのか

「真偽値における真の解釈」という概念的な話になると難しいので(ていうか、
私には高度過ぎるので)、そこらへんには触れずに、上述のような「仕様変更」
を提案しているだけのつもりですが、不十分でしょうか?

もし、この仕様変更には(例えば、Ruby の信念的にも)上記の「真偽値の解釈」
を避けては通れない、という事であれば、もう少し考えてみます。

> とか、意味のある値として偽を返したいときがあったりしないのか
> とかが気にならないでもないです。

えっと、それも大丈夫です。今、気付きましたが、collect{}.compact でなく
やはり grep(pat).collect{} でした。(コウモリ野郎)

ていうか、やっと、ここで自分の気持ちが整理できました。(遅いよ!)

「ブロックのある無しで、grep の返す配列の個数が違う」というのがとても
気持ち悪く、せめて「grep(pat){} が、grep(pat) と同じものを返す」のであ
れば、collect にも繋げ易い。(grep 内で完結できれば尚良し)。

というのが、どうやら、今回の提案の動機のようです。(今明かされる新事実)

要するに、現在、Array::method は、返り値の種類によって下記のように分類
できますが、
┌------------┬----------┬-----------┐
|配列数\種類|元の値    |加工した値 |
├------------+----------+-----------┤
|一定        |.select{} |.collect{} | # grep(){} は配列数的にはココ
├------------+----------+-----------┤
|可変        |.grep(pat)|    ---    |
└------------┴----------┴-----------┘

これを
┌------------┬----------┬------------┐
|配列数\種類|元の値    |加工した値  |
├------------+----------+------------┤
|一定        |.select{} |.collect{}  |
├------------+----------+------------┤
|可変        |.grep(pat)|.grep(pat){}|
└------------┴----------┴------------┘
とした方が、よく使われる(経験上&推測)右下のメソッドが補充できるばかり
か、grep の返り値における直観的イメージ(個数)にも合い、精神衛生上よい
と感じています。

返り値の個数は、grep(pat) の時点で決定しますので、「意味のある値として
の偽」を返す事も可能です。逆に言えば、このような仕様である方が、「意味
のある値としての偽」を返すのにも大変向いてると思います。

あー、すっきり!!どうでしょうか?

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