From: Takashi Ikeda Date: 1999-10-23T03:48:37+09:00 Subject: [ruby-dev:8090] Re: [ruby-list:17940] Enumerable#collect 池田孝志です。 レシーバのeachで得た要素の配列を返すだけのcollectなのですが、 module Enumerable def collect ary = [] if iterator? each {|elt| ary << yield(elt) } else each {|elt| ary << elt } end ary end end 互換性はあります。あとはコストを認めるかどうかなのでしょうか。 全然ソースを見ずにものを言ってるのですが、iterator? などはど れくらいのコストがあるものでしょうか?既存のスクリプトのこと を考えると(まあ、そんな大したことないと思うけど)気になりま す。 また、やはり何がやってくるか分からないと言うことで配列のため の最適化も出来そうですが、 module Enumerable def collect return self.dup if self.is_a? Array ary = [] if iterator? each {|elt| ary << yield(elt) } else each {|elt| ary << elt } end ary end end そこまでする必要もないですよね。以前のcollectに対しておこが ましいような。 ていうか、こんなことを言ってたら、collect!ってのが要るのかな… 要らない… ソースに落せと言われても分かりません。フォローお願いしますm(__)m やはり、動的にオブジェクトの持っている集合の内容が変わってく るような時は、これは役に立つのではと思ってます。 [ruby-list:17940]の例でも、srandしなければ、一応は乱数表にな りそうですし。あそこではレシーバが配列でないことを強調したかっ ただけなのであえていつも同じものを返すクラスを作ってみました が。 今考えている使い方としては、記事の集合があって、こいつが実際 には順序づけられていて、すべてを取り出したい時に、Enumerable のやり方で取り出せたらいいな、ということでした。 最初に必要を感じたのはDirでしたが、親/自分のディレクトリを取 り去りたかったせいでお流れになってました(^^; なにか、他に使えるクラスや事例があると面白そうです。 -- 池田 孝志 cercine@kcn.ne.jp