Project

General

Profile

Actions

Feature #4653

closed

[PATCH 1/1] new method Enumerable#rude_map

Added by shyouhei (Shyouhei Urabe) about 11 years ago. Updated over 10 years ago.

Status:
Rejected
Priority:
Normal
Target version:
[ruby-dev:43476]

Description

From e6dd7bd9b5769bae5d81416da7a2b4003a43ba06 Mon Sep 17 00:00:00 2001
Message-Id:
From: URABE, Shyouhei
Date: Sun, 8 May 2011 22:51:28 +0900
Subject: [PATCH 1/1] new method Enumerable#rude_map

時としてmapが配列を返さない方がいいのにと思うことがあります。

例としてはlzmaで圧縮されており解凍するととても大きくなるテキストファ
イルがあったとして、それを解凍して行番号をふってからHTML escapeして

ではさんでから連結したものを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

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

Related issues 2 (0 open2 closed)

Related to Ruby master - Feature #708: Lazy Enumerator#select, Enumerator#map etc.Rejectedmatz (Yukihiro Matsumoto)Actions
Related to Ruby master - Feature #4890: Enumerable#lazyClosedyhara (Yutaka HARA)06/16/2011Actions
Actions

Also available in: Atom PDF