From: "K.Kosako" Date: 2001-05-17T18:25:18+09:00 Subject: [ruby-dev:13228] Re: [ruby-list:29672] Re: Enumerator Shin-ichiro HARAさんの<4.3.2-J.20010517151203.0307a5d0@blade.nagaokaut.ac.jp>から > Enumerator というクラスですが、ほとんどダミーですよね。それをあ > えてクラスとして定義する必要はあるのか。例えば、匿名のオブジェク > トでも十分では?例えばこんな風に、、、 勉強になります。 この方法、イテレート速度は同等ですが、オブジェクト生成の 時間まで含めると、Enumeratorクラスと差があります。 それでも、クラスの数を安易に増やすな、というほうが より重要かもしれませんが。 def measure() GC::start t = Time.now yield printf($stdout, "%d sec.\n", Time.now - t) end def test1(e) measure { for i in 1..100000 e.collect { |b| b.equal?(100) ? 0 : b } end } end def test2(enum, obj, method) measure { for i in 1..100000 enum[obj, method].collect { |b| b.equal?(100) ? 0 : b } end } end require 'enumerator.rb' def Enumerable.[](enumobj, method, *args) e = Object.new.extend self e.instance_eval do @enumobj = enumobj @method = method @args = args end def e.each(&block) @enumobj.send(@method, *@args, &block) end def e.with_index() Enumerable[self, :each_with_index] end e end s = "abcdefghijklmnopqrstuvwxyz" test1(Enumerator[s, :each_byte]) # => 20 sec. test1(Enumerable[s, :each_byte]) # => 20 sec. test2(Enumerator, s, :each_byte) # => 23 sec. test2(Enumerable, s, :each_byte) # => 81 sec. ---- 小迫@ソフネック 渋谷区恵比寿1-15-1