原です。

In message "[ruby-dev:8328] Re: [REQ] [].grep(pat){} ==> [].grep(pat).collect{}"
    on 99/11/17, Kazunori NISHI <kazunori / swlab.csce.kyushu-u.ac.jp> writes:
|
|西@九大です。

|> ということですかね。[ruby-list:18600] では右下が空いてるなあという話だっ
|> たんですが。
|
|最初のは「機能」に関する表なので、空欄は無い方がいいですが、これ(block
|で選別)はその目的達成の「手段」に関する表だと思うので、こちらは空欄が
|あっても問題ない気がします。

そうかもしれないですが、select{}.collect{} で代用するとループを2度回す
ので、ちょっともったいない場合もあるんです。私が考えたのはブロックを評価
して nil でないものの値の配列を返すというものです。collect{}.compact 相
当ですね。手段と機能をごっちゃにするわけです。


|> あと、find 版というのもあって、、、、うーむ。もう少し整理したいなあ。
|
|これに関して簡単に考えてみたんですが、今回の変更で、grep は「返り値」

ここでいう find は Ruby の find (= detect) の事で、最初の要素を返すもの
です。要素がなければ nil なので、古い grep(pat) は、この detect 的な役割
も若干持っていたといえますね。新しい仕様では [] を返し、nil で無くなるわ
けですが。

それでは grep の find 版もあったっていいじゃないかと思う訳です。情けない
名前ですが、それを see としましょう。

             block版    pattern版
全てを返す   select{}   grep(pat)
最初を返す   detect{}   see(pat)

とこうなるわけ。ところで、grep(pat) にはイテレータ版があるので、
see(pat) にも(ほとんどご利益なないけど)欲しくならないだろうか。
というのもちょっと心配してます。


|という事で難しそうです。やはり、その場合は、
|  array .(配列数を決定) .(要素の値を加工)
|と明確に分けて、
|  array .find_all{} .collect{}
|でも構わないような気がしました。(自分が必要としないと冷たい人)

そういう気もするのですが、それなら、grep(pat){} もそうではないですか?
grep(pat).collect{} でいい訳ですよね。元々 grep にイテレータ版があったの
がいけなかった?

あと、もう一つ。grep(pat0, pat1,...) と複数のパターンを指定できるように
したらどうかという提案もあります。もちろん(when のアナロジーで)パター
ンのどれかに === ならそれを戻り値の配列に入れるのです。これは、and が
grep(pat0).grep(pat1).... と連接すればいいのと対になって、いい拡張ではな
いかと思うのですが(実際 Mathematica の Find はこんな感じです)、すると 
0 個のパターンというのも有り得て、grep() というのは、to_a と同じになる。
grep{} は、collect{} と同じになる。それでいいのだろうか?いいかもしれな
いし、悪いかもしれない。

で、何が言いたいかというと(^^;、とにかくこの辺りはややこしいので、一辺全
体を見ながら良く考えた方がいいかもしれない、ということです。