From: Kazunori NISHI Date: 1999-11-15T16:31:50+09:00 Subject: [ruby-dev:8315] Re: [ruby-list:18601] Re: [REQ] [].grep(pat){} ==> [].grep(pat).collect{} 西@九大です。 #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 ) ------------------------------------------------------------------