From: Akinori MUSHA Date: 2001-05-15T21:15:19+09:00 Subject: [ruby-dev:13202] Re: [ruby-list:29672] Re: Enumerator  ruby-dev に移ります。 At Tue, 15 May 2001 19:11:33 +0900, K.Kosako wrote: > Akinori MUSHAさんの<8666f9gyrz.wl@archon.local.idaemons.org>から > > 3. enum_with の名前はこれでいいのか? > > > > → enum, with なども考えられる。ただ、ともに少し意味が曖昧で、 > > ジェネリック過ぎる感じがする。これでいいのだ。 > > enum_withの機能は、Enumeratorオブジェクトを返すことだけですよね? > それなら、名前はto_enumのほうが分かり易いように思います。  Enumerable#to_enum というのは明らかに変なので、 Object に入れる 場合の話でしょうか。  どこに入れるかについて、さらに突っ込んで考えてみました。 a. Enumerable  Module や Class は Enumerable ではないので、クラス(モジュール) メソッドに対して適用できない。(e.g. ObjectSpace::each_object, Etc::group, Etc::passwd)  Module にも追加するということは考えられるが、その場合でもやはり 「each は用意していないが (つまり Enumerable ではない) 他の名前で イテレータを用意している」ものに対しては適用できない。これは、 each という名前のメソッドで列挙されるものが自明でないという場合 には十分あり得ることだ。  さらに、そもそも Enumerable とは include する側に each が存在 することを前提としたモジュールだが、 enum_with は each を利用 しないどころか、むしろ別のメソッドを each に見立てるためのもの であり、 Enumerable に入るのはおかしいのではないか。 b. Object  enum_with を任意のオブジェクトについて適用できるので、用法を 考えれば Object に入れるのがもっとも合理的である。  ただ、 Object に標準で入れるほど自然で価値があるものなのか、 という点が大きな問題となる。  とここまで考えたところで、いいことを思い付きました。 1. Enumerator をもっと使いやすくするため、 new のエイリアスと して [] を用意する。(Array, Hash に倣う) 2. Enumerator#with を用意し、 Enumerable, Object はそのまま。 これによって、 Enumerator[ObjectSpace, :each_object].collect {|x| ...} # または Enumerator[ObjectSpace].with(:each_object).collect {|x| ...} Enumerator[str, :each_byte).with(:each_with_index) {|b,i| ...} # または Enumerator[str].with(:each_byte).with(:each_with_index) {|b,i| ...} と書けるようになります。Enumerator クラスのインスタンスメソッド なら、 with でもぶつかる心配はありませんし、意味も明確です。  今度こそいかがでしょうか? -- / /__ __ Akinori.org / MUSHA.org / ) ) ) ) / FreeBSD.org / Ruby-lang.org Akinori MUSHA aka / (_ / ( (__( @ iDaemons.org / and.or.jp "Freeze this moment a little bit longer, make each impression a little bit stronger.. Experience slips away -- Time stand still"