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