Generator from Enumerable#map

e$B1sF#$H?=$7$^$9!#e(B

1.9 e$B$G$O!“e(BEnumerable#map e$B$de(B Enumerable#index
e$B$r%V%m%C%/$J$7$G8F$V$He(B
generator e$B$rJV$9$h$&$G$9$,!”$3$l$Oe(B Object#to_enum
e$B$H2?$+0[$J$k$Ne(B
e$B$G$7$g$&$+!#e(B

$ ./ruby -ve ‘g = [:a, :b, :c].map; loop { p g.next }’
ruby 1.9.0 (2007-09-15 patchlevel 0) [i686-linux]
:a
:b
:c

$ ./ruby -ve ‘g = [:a, :b, :c].index; loop { p g.next }’
ruby 1.9.0 (2007-09-15 patchlevel 0) [i686-linux]
:a
:b
:c

e$BFC$K$3$l$i$K0UL#$,$J$$$N$G$"$l$P!";EMM$rJQ$($kI,MW$,$J$$$h$&$J5$$,$9$ke(B
e$B$N$G$9$,!"$I$&$G$7$g$&$+!#e(B

Enumerator e$B$Ge(B yield
e$B$NJV$jCMAjEv$J$I$r;XDj$G$-$k$J$i0UL#$,$"$j$=$&$G$9!#e(B
e$BNc$($Pe(B Enumerator#value= e$B$He(B #result
e$B$rF~$l$F$3$s$JIw$K!#e(B

g = [1, 2, 3].map
loop { x = g.next; g.value = x * 2 }
p g.result #=> [2, 4, 6]

g = [:a, :b, :c].index
loop { x = g.next; g.value = x == :b }
p g.result #=> 1

e$B1sF#$G$9!#e(B

1.9 e$B$G$O!“e(BEnumerable#map e$B$de(B Enumerable#index e$B$r%V%m%C%/$J$7$G8F$V$He(B
generator e$B$rJV$9$h$&$G$9$,!”$3$l$Oe(B Object#to_enum e$B$H2?$+0[$J$k$Ne(B
e$B$G$7$g$&$+!#e(B

e$B>p$1$J$$$3$H$K$^$@$o$+$C$F$^$;$s!#5$$K$J$k$N$G65$($F$$$?$@$1$^$;$se(B
e$B$G$7$g$&$+!#e(B

p g.result #=> 1
e$B$3$N3HD%$,FCJL$KM_$7$$$o$1$G$O$J$$$N$G$9$,!“30It%$%F%l!<%?$re(B fiber
e$B$Ne(B
e$BBeMQ$H$9$k$?$a$K$OL5$$$HITJX$J$N$G!”;n$7$K<BAu$7$F$_$^$7$?!#e(B

Fiber#resume e$B$N0z?te(B (= Fiber.yield e$B$NJVCMe(B)

e$B$r;XDj$G$-$J$$$N$G!#e(B

e$B%a%=%C%IL>$d%$%s%?!<%U%’%$%9$O$b$C$H$$$$$N$,$"$j$=$&$G$9!#e(B

Index: enumerator.c

— enumerator.c (revision 13509)
+++ enumerator.c (working copy)
@@ -42,6 +42,8 @@
VALUE method;
VALUE proc;
VALUE args;

  • VALUE value;

  • VALUE result;
    enum_iter *iter;
    VALUE fib;
    VALUE dst;
    @@ -55,6 +57,8 @@
    rb_gc_mark(ptr->method);
    rb_gc_mark(ptr->proc);
    rb_gc_mark(ptr->args);

  • rb_gc_mark(ptr->value);

  • rb_gc_mark(ptr->result);
    rb_gc_mark(ptr->fib);
    rb_gc_mark(ptr->dst);
    }
    @@ -238,6 +242,8 @@
    ptr->iter = (enum_iter *)rb_yield;
    }
    if (argc) ptr->args = rb_ary_new4(argc, argv);

  • ptr->value = Qnil;

  • ptr->result = Qnil;
    ptr->fib = 0;
    ptr->dst = Qnil;
    ptr->no_next = Qfalse;
    @@ -286,6 +292,8 @@
    ptr1->proc = ptr0->proc;
    ptr1->iter = ptr0->iter;
    ptr1->args = ptr0->args;

  • ptr1->value = ptr0->value;

  • ptr1->result = ptr0->result;
    ptr1->fib = ptr0->fib;

    return obj;
    @@ -371,8 +379,9 @@
    next_ii(VALUE i, VALUE obj)
    {
    struct enumerator *e = enumerator_ptr(obj);

  • e->value = Qnil;
    rb_fiber_yield(1, &i);

  • return Qnil;
  • return e->value;
    }

static VALUE
@@ -381,7 +390,7 @@
struct enumerator *e = enumerator_ptr(obj);
VALUE nil = Qnil;

  • rb_block_call(obj, rb_intern(“each”), 0, 0, next_ii, obj);
  • e->result = rb_block_call(obj, rb_intern(“each”), 0, 0, next_ii,
    obj);
    e->no_next = Qtrue;
    return rb_fiber_yield(1, &nil);
    }
    @@ -431,6 +440,36 @@

/*

  • call-seq:
    • e.value = v => v
    • Sets the value that current block will return.
  • */

+static VALUE
+enumerator_set_value(VALUE obj, VALUE value) {

  • struct enumerator *e = enumerator_ptr(obj);
  • e->value = value;
  • return value;
    +}

+/*

    • call-seq:
    • e.result => object
    • Returns the value that the iteration method returned.
  • */

+static VALUE
+enumerator_result(VALUE obj) {

  • struct enumerator *e = enumerator_ptr(obj);
  • return e->result;
    +}

+/*

    • call-seq:
    • e.next? => e
    • Rewinds the enumeration sequence by the next method.
      @@ -467,6 +506,8 @@
      rb_define_method(rb_cEnumerator, “to_splat”, enumerator_to_splat,
      0);
      rb_define_method(rb_cEnumerator, “next”, enumerator_next, 0);
      rb_define_method(rb_cEnumerator, “rewind”, enumerator_rewind, 0);
  • rb_define_method(rb_cEnumerator, “value=”, enumerator_set_value,
    1);

  • rb_define_method(rb_cEnumerator, “result”, enumerator_result, 0);

    rb_eStopIteration = rb_define_class(“StopIteration”,
    rb_eIndexError);

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

e$BH?1~$,CY$/$F$4$a$s$J$5$$!#e(B

In message “Re: [ruby-dev:31847] Re: generator from Enumerable#map”
on Tue, 25 Sep 2007 02:09:33 +0900, “Yusuke ENDOH” [email protected]
writes:

|> 1.9 e$B$G$O!“e(BEnumerable#map e$B$de(B Enumerable#index e$B$r%V%m%C%/$J$7$G8F$V$He(B
|> generator e$B$rJV$9$h$&$G$9$,!”$3$l$Oe(B Object#to_enum e$B$H2?$+0[$J$k$Ne(B
|> e$B$G$7$g$&$+!#e(B
|
|e$B>p$1$J$$$3$H$K$^$@$o$+$C$F$^$;$s!#5$$K$J$k$N$G65$($F$$$?$@$1$^$;$se(B
|e$B$G$7$g$&$+!#e(B

e$B0[$J$C$F$$$^$;$s!#$=$NB8:_$KBP>N@-0J30$NM}M3$O$“$j$^$;$s!#FCe(B
e$B$KJXMx$@$H;W$C$F$$$k$o$1$G$O$J$$$G$9!#BP>N@-e(B(e$B$H$+D>8r@-e(B)e$B$Oe(B
Rubye$B$N@_7W4p=`$G$OM%@hEY$,Dc$$$N$G!”$J$K$+M}M3$,$“$l$P$=$l$re(B
e$B$R$C$/$j$+$($9$3$H$K0[O@$O$”$j$^$;$s!#e(B

|> Enumerator e$B$Ge(B yield e$B$NJV$jCMAjEv$J$I$r;XDj$G$-$k$J$i0UL#$,$"$j$=$&$G$9!#e(B

|e$B$3$N3HD%$,FCJL$KM_$7$$$o$1$G$O$J$$$N$G$9$,!“30It%$%F%l!<%?$re(B fiber e$B$Ne(B
|e$BBeMQ$H$9$k$?$a$K$OL5$$$HITJX$J$N$G!”;n$7$K<BAu$7$F$_$^$7$?!#e(B
|# Fiber#resume e$B$N0z?te(B (= Fiber.yield e$B$NJVCMe(B) e$B$r;XDj$G$-$J$$$N$G!#e(B

e$B$(!<$H!"e(BFibere$B$,$J$$$o$1$G$O$J$$e(B(e$B$C$F$$$&$+30It%$%F%l!<%?$,e(B
Fibere$B$r;H$C$F<BAu$5$l$F$$$ke(B)e$B$N$G!"FC$K30It%$%F%l!<%?$re(BFibere$B$Ne(B
e$BBe$o$j$K;H$&I,MW$O$J$$$s$8$c$J$$$G$7$g$&$+!#e(B

e$B1sF#$G$9!#e(B

|> 1.9 e$B$G$O!“e(BEnumerable#map e$B$de(B Enumerable#index e$B$r%V%m%C%/$J$7$G8F$V$He(B
|> generator e$B$rJV$9$h$&$G$9$,!”$3$l$Oe(B Object#to_enum e$B$H2?$+0[$J$k$Ne(B
|> e$B$G$7$g$&$+!#e(B

e$B0[$J$C$F$$$^$;$s!#$=$NB8:_$KBP>N@-0J30$NM}M3$O$"$j$^$;$s!#FCe(B
e$B$KJXMx$@$H;W$C$F$$$k$o$1$G$O$J$$$G$9!#BP>N@-e(B(e$B$H$+D>8r@-e(B)e$B$Oe(B
Rubye$B$N@_7W4p=`$G$OM%@hEY$,Dc$$$N$G!"$J$K$+M}M3$,$"$l$P$=$l$re(B
e$B$R$C$/$j$+$($9$3$H$K0[O@$O$"$j$^$;$s!#e(B

e$BBP>N@-$N0UL#$,$h$/$o$+$j$^$;$s$,!"e(B

each e$B$be(B map e$B$b%$%F%l!<%H$9$kE@$G;w$F$$$k$+$i!"e(B
each e$B$G%V%m%C%/$r>JN,$7$?;~e(B generator e$B$rJV$9$J$i!"e(B
map e$B$G%V%m%C%/$r>JN,$7$?;~$be(B generator e$B$rJV$9$Y$-e(B

e$B$H$$$&$3$H$G$7$g$&$+!#$=$3$@$1BP>N$K$7$F$b!"e(Bmap e$B$de(B index
e$B$NK\Mh$Ne(B
e$B5!G=$re(B generator
e$B$G@8$+$;$J$$$N$G$O!"CfESH>C<$9$.$k$H46$8$^$7$?!#e(B

e$B;d$N9M$($kBP>N@-$O!"e(B

each e$B$be(B map e$B$b%$%F%l!<%H$9$kE@$G;w$F$$$k$+$i!"e(B
each e$B$,%V%m%C%/$G$be(B generator e$B$G$b$=$N5!G=$r;H$($k$J$i!"e(B
map e$B$b%V%m%C%/$G$be(B generator e$B$G$b$=$N5!G=$r;H$($k$Y$-e(B

e$B$J$N$G!“e(BEnumerator#value=
e$B$$?$$$J;EAH$$,$”$C$?J}$,BP>N@-$,$"$k$He(B
e$B46$8$^$9!#e(B

e$B$G$b$3$&$$$&@_7W%;%s%9$OB?J,$^$D$b$H$5$s$NJ}$,NI$$$N$G!"$=$s$J$K6/$/e(B
e$B<gD%$9$k5$$O$"$j$^$;$se(B (e$B>Pe(B)

e$B$"$($F5R4QE*$C$]$$H?BPM}M3$r>e$2$k$H$9$l$P!"e(B

  • e$B%V%m%C%/$r=q$-K:$l$?$H$-$N%P%0$K5$$,$D$-$K$/$/$J$ke(B
    (e$B$3$N;EMM$K5$$,$D$$$?$N$b%V%m%C%/$N=q$-K:$l$G$O$^$C$?$+$ie(B)
  • e$B<B1W$bBg$-$J0UL#$b$J$$$J$i;EMMJQ99$O$7$J$$J}$,$$$$e(B

e$B$G$9$,!"$I$A$i$b$/$@$i$J$$$3$H$J$N$G!"$3$l$b@Q6KE*$K$O<gD%$7$^$;$s!#e(B

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:31916] Re: generator from Enumerable#map”
on Sun, 30 Sep 2007 19:25:42 +0900, “Yusuke ENDOH” [email protected]
writes:

|> e$B0[$J$C$F$$$^$;$s!#$=$NB8:_$KBP>N@-0J30$NM}M3$O$“$j$^$;$s!#FCe(B
|> e$B$KJXMx$@$H;W$C$F$$$k$o$1$G$O$J$$$G$9!#BP>N@-e(B(e$B$H$+D>8r@-e(B)e$B$Oe(B
|> Rubye$B$N@_7W4p=`$G$OM%@hEY$,Dc$$$N$G!”$J$K$+M}M3$,$“$l$P$=$l$re(B
|> e$B$R$C$/$j$+$($9$3$H$K0[O@$O$”$j$^$;$s!#e(B
|
|e$BBP>N@-$N0UL#$,$h$/$o$+$j$^$;$s$,!"e(B
|
| each e$B$be(B map e$B$b%$%F%l!<%H$9$kE@$G;w$F$$$k$+$i!"e(B
| each e$B$G%V%m%C%/$r>JN,$7$?;~e(B generator e$B$rJV$9$J$i!"e(B
| map e$B$G%V%m%C%/$r>JN,$7$?;~$be(B generator e$B$rJV$9$Y$-e(B
|
|e$B$H$$$&$3$H$G$7$g$&$+!#$=$3$@$1BP>N$K$7$F$b!"e(Bmap e$B$de(B index e$B$NK\Mh$Ne(B
|e$B5!G=$re(B generator e$B$G@8$+$;$J$$$N$G$O!"CfESH>C<$9$.$k$H46$8$^$7$?!#e(B

e$B$(!<$H!“!V$J$iMW$i$J$$$N$+$J$”!W$H:n6H$r;O$a$h$&$H$7$F$h$&$de(B
e$B$/;W$$=P$7$^$7$?!#e(Bmape$B$,e(Benumeratore$B$rJV$9$He(B

obj.map.with_index{|x,i|…}

e$B$,$G$-$k$N$,4r$7$$$N$GF3F~$7$?$N$G$7$?!#$H$$$&$o$1$G!"e(B

  • eache$B$K$be(Bmape$B$K$be(Bwith_indexe$B$,IU$1$i$l$F4r$7$$e(B

e$B$H$$$&$N$,K\Ev$NM}M3$G$9!#e(B

|e$B;d$N9M$($kBP>N@-$O!"e(B
|
| each e$B$be(B map e$B$b%$%F%l!<%H$9$kE@$G;w$F$$$k$+$i!"e(B
| each e$B$,%V%m%C%/$G$be(B generator e$B$G$b$=$N5!G=$r;H$($k$J$i!“e(B
| map e$B$b%V%m%C%/$G$be(B generator e$B$G$b$=$N5!G=$r;H$($k$Y$-e(B
|
|e$B$J$N$G!“e(BEnumerator#value= e$B$$?$$$J;EAH$$,$”$C$?J}$,BP>N@-$,$”$k$He(B
|e$B46$8$^$9!#e(B

Enumerator#value=e$B$C$F$$$^$$$AF0:n$,GD0.$G$-$J$$$s$G$9$h$M$(!#e(B

| - e$B%V%m%C%/$r=q$-K:$l$?$H$-$N%P%0$K5$$,$D$-$K$/$/$J$ke(B
| (e$B$3$N;EMM$K5$$,$D$$$?$N$b%V%m%C%/$N=q$-K:$l$G$O$^$C$?$+$ie(B)

e$B$3$l$O3N$+$K$"$j$^$9$M$(!#e(B

                            e$B$^$D$b$He(B e$B$f$-$R$me(B /:|)

e$B1sF#$G$9!#e(B

07/10/05 e$B$Ke(B Yukihiro M.[email protected]
e$B$5$s$O=q$-$^$7$?e(B:

  • eache$B$K$be(Bmape$B$K$be(Bwith_indexe$B$,IU$1$i$l$F4r$7$$e(B

e$B$H$$$&$N$,K\Ev$NM}M3$G$9!#e(B

e$B$J$k$[$I!<!“$”$j$,$H$&$4$6$$$^$9!#e(B
enumerator e$B$K$O%$%F%l!<%?$N5!G=$N0lHL2=$H30It%$%F%l!<%?2=$Ne(B 2
e$B$D$N5!G=$,e(B
e$B5M$a9~$^$l$F$$$k$N$G$9$M!#e(B

| - e$B%V%m%C%/$r=q$-K:$l$?$H$-$N%P%0$K5$$,$D$-$K$/$/$J$ke(B
| (e$B$3$N;EMM$K5$$,$D$$$?$N$b%V%m%C%/$N=q$-K:$l$G$O$^$C$?$+$ie(B)

e$B$3$l$O3N$+$K$"$j$^$9$M$(!#e(B

e$B$^$“!”$O$^$C$?K?M$O$I$&$G$b$$$$$3$H$@$H;W$C$F$$$^$9e(B (e$B>Pe(B)
e$B%V%m%C%/$r=q$-K:$l$k$3$H$J$s$FLGB?$K$J$5$=$&$G$9$7!";d$,$O$^$C$?>u67$be(B

ary.map do … end

e$B$r$&$C$+$je(B

p ary.map do … end

e$B$H=q$-D>$7$F$7$^$C$?$H$$$&$h$/$"$k%_%9$J$N$G!“e(Bmap
e$B$K:a$O$”$j$^$;$s!#e(B

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:32055] Re: generator from Enumerable#map”
on Mon, 15 Oct 2007 01:33:16 +0900, “Yusuke ENDOH” [email protected]
writes:

|07/10/05 e$B$Ke(B Yukihiro M.[email protected] e$B$5$s$O=q$-$^$7$?e(B:
|> * eache$B$K$be(Bmape$B$K$be(Bwith_indexe$B$,IU$1$i$l$F4r$7$$e(B
|>
|> e$B$H$$$&$N$,K\Ev$NM}M3$G$9!#e(B
|
|e$B$J$k$[$I!<!“$”$j$,$H$&$4$6$$$^$9!#e(B
|enumerator e$B$K$O%$%F%l!<%?$N5!G=$N0lHL2=$H30It%$%F%l!<%?2=$Ne(B 2 e$B$D$N5!G=$,e(B
|e$B5M$a9~$^$l$F$$$k$N$G$9$M!#e(B

e$B$=$&$G$9!#$5$5$@$/$s$O!V5$;}$A0-$$!W$HH?BP$7$^$7$?$,!“Bg%/%ie(B
e$B%9<g5A$r$?$F$K2!$7@Z$j$^$7$?!#ITI>$G$”$l$P;d$N@UG$$G$9!#e(B

|e$B%V%m%C%/$r=q$-K:$l$k$3$H$J$s$FLGB?$K$J$5$=$&$G$9$7!“;d$,$O$^$C$?>u67$be(B
|
|ary.map do … end
|
|e$B$r$&$C$+$je(B
|
|p ary.map do … end
|
|e$B$H=q$-D>$7$F$7$^$C$?$H$$$&$h$/$”$k%_%9$J$N$G!“e(Bmap e$B$K:a$O$”$j$^$;$s!#e(B

e$B$“$k$”$k!#e(BRubye$B$NMn$H$77j$N0l$D$G$9$M!#e(B