Issue #4653 has been updated by Shota Fukumori.


??±é?????convension?????¨æ?????????¨ç?ºæ?£ã???????¨æ?¸ã???????¦ã???????®ã?«ã????£ã?¦ã????¾ã????¾ã???????????

Enumerator#defer???å®?義ã????¦ã????®ã???????ªå½¢??«ã???????¨è?¯ã????®ã?§ã?¯ã?¨æ???????¾ã????????

???人ç????«è??????????¯ã????????ä¸???ªã????£ã???????????ªã???????¨æ???????¾ã?????

[1,2,3].map.defer{|x| x*2 }.each_with_index.map.defer do |x,i|
  "#{x}: #{i}"
end.each {|x| puts x }

???????????§ã??????????????

?????????: https://gist.github.com/964510
----------------------------------------
Feature #4653: [PATCH 1/1] new method Enumerable#rude_map
http://redmine.ruby-lang.org/issues/4653

Author: Shyouhei Urabe
Status: Assigned
Priority: Normal
Assignee: Yukihiro Matsumoto
Category: core
Target version: 1.9.3


From e6dd7bd9b5769bae5d81416da7a2b4003a43ba06 Mon Sep 17 00:00:00 2001
Message-Id: <e6dd7bd9b5769bae5d81416da7a2b4003a43ba06.1304863013.git.shyouhei / ruby-lang.org>
From: URABE, Shyouhei <shyouhei / ruby-lang.org>
Date: Sun, 8 May 2011 22:51:28 +0900
Subject: [PATCH 1/1] new method Enumerable#rude_map

?????¨ã?????map????????????è¿??????ªã????¹ã??????????®ã?«ã?¨æ??????????¨ã??????????¾ã?????

ä¾???¨ã????¦ã??lzma??§å?§ç¸®????????¦ã?????è§£å??????????¨ã?¨ã?¦ã??大ã??????ªã???????­ã?¹ã????????
??¤ã?«ã???????£ã????¨ã????¦ã???????????è§£å???????¦è????ªå????µã?£ã?¦ã?????HTML escape??????
<pre></pre>??§ã?¯ã???????§ã???????£ç?????????????®ã??lzma??§å?§ç¸®?????ªã?????å¿?è¦??????????
?????¨ã????¾ã??(æ³?:å®?è©?)???????????§ã??è¡???ªå????µã?£ã?¦ã????¨ã??HTML escape?????¦ã?????
ç´???´ã?«è??????????¨ã??lzcat???popen???????????®ã?«å¯¾??????
io.each_line.map.with_index.map. ... ??¨ã????????æ§???????Ruby??¨ã????¦ã?¯è?ªç??
?????¨æ???????¾ã???????????map????????????ä½???£ã?¦ã????¾ã????¨ã???????®ã????¡ã?¢ã?ªæ??è²»é???????
?????????????¾ã??????????§ã????????Enumerator??§ã????£ã???????¨å?¦ç?????????????¨ã???????§ã?????

??¨ã?????????????map??ªã??????????©é?????????????ªã????Enumerator???è¿????map??®å??種ã?????
?????¨ã???????¨ã??????????®ã?§ã???????©ã????§ã??????????????1.9??«ã?¯ã?????flat_map????????????
??§ã?ªã????¨ã??_map???å¢???????å¿?????????µæ????¯å????ªã???????ªã?¨æ???????®ã?§æ?°è???¡ã?½ã????????
?????¦ã?¿ã?¾ã????????????????ªã??map??®æ?»ã????¤ã?®å?????å¤????????®ã?§ã??ç§???¯ã???????§ã????????
??¡ã????£ã?¨ã??????????????¨ã??????????¾ã?????

Signed-off-by: URABE, Shyouhei <shyouhei / ruby-lang.org>

diff --git a/enum.c b/enum.c
index 584b838..449406b 100644
--- a/enum.c
+++ b/enum.c
@@ -462,6 +462,41 @@ enum_flat_map(VALUE obj)
     return ary;
 }
 
+static VALUE
+rude_map_ii(VALUE i, VALUE y, int c, VALUE *v)
+{
+    return rb_funcall(y, rb_intern("<<"), 1, enum_yield(c, v));
+}
+
+static VALUE
+rude_map_i(VALUE y, VALUE i, int c, VALUE *v)
+{
+    return rb_block_call(i, id_each, 0, 0, rude_map_ii, y);
+}
+
+/*
+ *  call-seq:
+ *     enum.rude_map {| obj | block }  -> enumerator
+ *     enum.rude_map                   -> enumerator
+ *
+ *  Identical to Enumerable#map, except that it returns an enumerator
+ *  rather than an array.
+ *
+ *  Without a block it is just another Object#to_enum.
+ *
+ */
+
+static VALUE
+enum_rude_map(VALUE obj)
+{
+    VALUE ret;
+    RETURN_ENUMERATOR(obj, 0, 0);
+
+    ret = rb_obj_alloc(rb_cEnumerator);
+    rb_block_call(ret, rb_intern("initialize"), 0, 0, rude_map_i, obj);
+    return ret;
+}
+
 /*
  *  call-seq:
  *     enum.to_a      ->    array
@@ -2679,6 +2714,7 @@ Init_Enumerable(void)
     rb_define_method(rb_mEnumerable, "collect", enum_collect, 0);
     rb_define_method(rb_mEnumerable, "map", enum_collect, 0);
     rb_define_method(rb_mEnumerable, "flat_map", enum_flat_map, 0);
+    rb_define_method(rb_mEnumerable, "rude_map", enum_rude_map, 0);
     rb_define_method(rb_mEnumerable, "collect_concat", enum_flat_map, 0);
     rb_define_method(rb_mEnumerable, "inject", enum_inject, -1);
     rb_define_method(rb_mEnumerable, "reduce", enum_inject, -1);
-- 
1.7.0.4




-- 
http://redmine.ruby-lang.org