From: Kazunori NISHI Date: 1999-11-15T06:05:49+09:00 Subject: [ruby-list:18588] [REQ] [].grep(pat){} ==> [].grep(pat).collect{} 西@九大です。 多分、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 ) ------------------------------------------------------------------