# Generator from Enumerable#map

**URL:** <https://www.ruby-forum.com/t/generator-from-enumerable-map/114995>\
**Category:** Development\
**Created:** [September 19, 2007, 4:20pm UTC](https://www.ruby-forum.com/t/generator-from-enumerable-map/114995 "2007-09-19T16:20:31Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [September 19, 2007, 4:20pm UTC](https://www.ruby-forum.com/t/generator-from-enumerable-map/114995/1 "2007-09-19T16:20:31Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [September 24, 2007, 7:09pm UTC](https://www.ruby-forum.com/t/generator-from-enumerable-map/114995/2 "2007-09-24T19:09:58Z")

</div>

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;

- 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);

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [September 29, 2007, 5:24pm UTC](https://www.ruby-forum.com/t/generator-from-enumerable-map/114995/3 "2007-09-29T17:24:43Z")

</div>

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” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
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

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [September 30, 2007, 12:26pm UTC](https://www.ruby-forum.com/t/generator-from-enumerable-map/114995/4 "2007-09-30T12:26:16Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [October 5, 2007, 3:32pm UTC](https://www.ruby-forum.com/t/generator-from-enumerable-map/114995/5 "2007-10-05T15:32:35Z")

</div>

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” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
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 /:|)

```

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [October 14, 2007, 6:34pm UTC](https://www.ruby-forum.com/t/generator-from-enumerable-map/114995/6 "2007-10-14T18:34:10Z")

</div>

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

07/10/05 e$B$Ke(B Yukihiro M.[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
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

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [October 15, 2007, 2:38am UTC](https://www.ruby-forum.com/t/generator-from-enumerable-map/114995/7 "2007-10-15T02:38:36Z")

</div>

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” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
writes:

|07/10/05 e$B$Ke(B Yukihiro M.[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) 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
