e$B1sF#$G$9!#e(B
Enumerator.new e$B$NCf$Ge(B yielder << 1 << 2 << 3 e$B$H=q$1$^$;$s!#e(B
OK
generator = Enumerator.new do |yielder|
yielder << 1
yielder << 2
yielder << 3
end
generator.each {|x| p x } #=> 1, 2, 3
NG
generator = Enumerator.new do |yielder|
yielder << 1 << 2 << 3
end
generator.each {|x| p x } #=> 1
Enumerator::Yielder#<< e$B$,e(B {|x| p x }
e$B$N%V%m%C%/$NLa$jCM$rJV$9$?$ae(B
e$BJQ$J$3$H$K$J$C$F$$$^$9!#e(B
Yielder#<< e$B$Oe(B IO
e$B=PNO$N$h$&$K!"Ns5s$7$?$$$b$N$rN.$79~$`$h$&$K;H$&e(B
e$B$b$N$@$H;W$C$F$$$^$9!#$3$NM}2r$,@5$7$1$l$P!“6/Nu$K0cOB46$N$”$k5sF0e(B
e$B$@$H;W$$$^$9!#e(B
e$B:#e(B Yielder#<< e$B$Oe(B Yielder#yield e$B$Ne(B alias
e$B$K$J$C$F$$$^$9$,!"e(Byield e$B$Oe(B
e$B85$N5sF0$N$^$^!"e(BYielder#<< e$B$@$1>o$Ke(B self
e$B$rJV$9$h$&$K$7$F$b$$$$$Ge(B
e$B$7$g$&$+!#e(B
diff --git a/enumerator.c b/enumerator.c
index e341c07…7c50f3d 100644
— a/enumerator.c
+++ b/enumerator.c
@@ -1012,6 +1012,13 @@ yielder_yield(VALUE obj, VALUE args)
return rb_proc_call(ptr->proc, args);
}
+/* :nodoc: */
+static VALUE yielder_yield_push(VALUE obj, VALUE args)
+{
- yielder_yield(obj, args);
- return obj;
+}
static VALUE
yielder_yield_i(VALUE obj, VALUE memo, int argc, VALUE *argv)
{
@@ -1228,7 +1235,7 @@ Init_Enumerator(void)
rb_define_alloc_func(rb_cYielder, yielder_allocate);
rb_define_method(rb_cYielder, “initialize”, yielder_initialize, 0);
rb_define_method(rb_cYielder, “yield”, yielder_yield, -2);
- rb_define_method(rb_cYielder, “<<”, yielder_yield, -2);
-
rb_define_method(rb_cYielder, “<<”, yielder_yield_push, -2);
id_rewind = rb_intern(“rewind”);
id_each = rb_intern(“each”);