ruby1.9: enumerator

enumeratorのジェネレータ生成部分のソースコードを読む。

/*
 *  call-seq:
 *    enum.each {...}
 *
 *  Iterates the given block using the object and the method specified
 *  in the first place.  If no block is given, returns self.
 *
 */
static VALUE
enumerator_each(VALUE obj)
{
    struct enumerator *e;
    int argc = 0;
    VALUE *argv = 0;

    if (!rb_block_given_p()) return obj;
    e = enumerator_ptr(obj);
    if (e->args) {
	argc = RARRAY_LEN(e->args);
	argv = RARRAY_PTR(e->args);
    }
    return rb_block_call(e->obj, e->meth, argc, argv,
			 enumerator_each_i, (VALUE)e);
}

ブロックがない場合はselfを返してる…じゃあeachはいらないのか。
each使ったのってなんでだっけな?

require 'enumerator'

def fib
  a = 1
  b = 1

  loop do
    yield(a)
    tmp = a
    a = b;
    b = tmp + b
  end
end

g = enum_for(:fib)

10.times do
  p g.next
end


~/work$ ruby foo.rb
1
1
2
3
5
8
13
21
34
55