mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* enumerator.c: Activate Enumerator#with_object and add
Enumerable#each_with_object. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@18864 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
cb32985d03
commit
3e8c3897ab
3 changed files with 42 additions and 6 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
Tue Aug 26 14:43:10 2008 Akinori MUSHA <knu@iDaemons.org>
|
||||||
|
|
||||||
|
* enumerator.c: Activate Enumerator#with_object and add
|
||||||
|
Enumerable#each_with_object.
|
||||||
|
|
||||||
Tue Aug 26 14:38:32 2008 Akinori MUSHA <knu@iDaemons.org>
|
Tue Aug 26 14:38:32 2008 Akinori MUSHA <knu@iDaemons.org>
|
||||||
|
|
||||||
* enumerator.c (enumerator_initialize),
|
* enumerator.c (enumerator_initialize),
|
||||||
|
|
2
doc/NEWS
2
doc/NEWS
|
@ -111,6 +111,8 @@ Compatible
|
||||||
* Enumerable and Enumerator
|
* Enumerable and Enumerator
|
||||||
o Enumerable#map,collect_all called without a block returns
|
o Enumerable#map,collect_all called without a block returns
|
||||||
an enumerator.
|
an enumerator.
|
||||||
|
o Enumerable#each_with_object [experimental]
|
||||||
|
o Enumerator#with_object [experimental]
|
||||||
o Enumerator.new { ... } [experimental]
|
o Enumerator.new { ... } [experimental]
|
||||||
* Regexp#match, String#match
|
* Regexp#match, String#match
|
||||||
o Regexp#match, String#match
|
o Regexp#match, String#match
|
||||||
|
|
41
enumerator.c
41
enumerator.c
|
@ -216,6 +216,37 @@ enum_each_cons(VALUE obj, VALUE n)
|
||||||
return Qnil;
|
return Qnil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
each_with_object_i(VALUE val, VALUE memo)
|
||||||
|
{
|
||||||
|
return rb_yield_values(2, val, memo);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* call-seq:
|
||||||
|
* each_with_object(obj) {|(*args), memo_obj| ... }
|
||||||
|
* each_with_object(obj)
|
||||||
|
*
|
||||||
|
* Iterates the given block for each element with an arbitrary
|
||||||
|
* object given, and returns the initially given object.
|
||||||
|
|
||||||
|
* If no block is given, returns an enumerator.
|
||||||
|
*
|
||||||
|
* e.g.:
|
||||||
|
* evens = (1..10).each_with_object([]) {|i, a| a << i*2 }
|
||||||
|
* # => [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static VALUE
|
||||||
|
enum_each_with_object(VALUE obj, VALUE memo)
|
||||||
|
{
|
||||||
|
RETURN_ENUMERATOR(obj, 1, &memo);
|
||||||
|
|
||||||
|
rb_block_call(obj, SYM2ID(sym_each), 0, 0, each_with_object_i, memo);
|
||||||
|
|
||||||
|
return memo;
|
||||||
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
enumerator_allocate(VALUE klass)
|
enumerator_allocate(VALUE klass)
|
||||||
{
|
{
|
||||||
|
@ -412,7 +443,7 @@ enumerator_with_object_i(VALUE val, VALUE memo)
|
||||||
* e.with_object(obj)
|
* e.with_object(obj)
|
||||||
*
|
*
|
||||||
* Iterates the given block for each element with an arbitrary
|
* Iterates the given block for each element with an arbitrary
|
||||||
* object given, and returns memo object.
|
* object given, and returns the initially given object.
|
||||||
*
|
*
|
||||||
* If no block is given, returns an enumerator.
|
* If no block is given, returns an enumerator.
|
||||||
*
|
*
|
||||||
|
@ -424,7 +455,7 @@ enumerator_with_object(VALUE obj, VALUE memo)
|
||||||
int argc = 0;
|
int argc = 0;
|
||||||
VALUE *argv = 0;
|
VALUE *argv = 0;
|
||||||
|
|
||||||
RETURN_ENUMERATOR(obj, 0, 0);
|
RETURN_ENUMERATOR(obj, 1, &memo);
|
||||||
e = enumerator_ptr(obj);
|
e = enumerator_ptr(obj);
|
||||||
if (e->args) {
|
if (e->args) {
|
||||||
argc = RARRAY_LEN(e->args);
|
argc = RARRAY_LEN(e->args);
|
||||||
|
@ -734,6 +765,7 @@ Init_Enumerator(void)
|
||||||
|
|
||||||
rb_define_method(rb_mEnumerable, "each_slice", enum_each_slice, 1);
|
rb_define_method(rb_mEnumerable, "each_slice", enum_each_slice, 1);
|
||||||
rb_define_method(rb_mEnumerable, "each_cons", enum_each_cons, 1);
|
rb_define_method(rb_mEnumerable, "each_cons", enum_each_cons, 1);
|
||||||
|
rb_define_method(rb_mEnumerable, "each_with_object", enum_each_with_object, 1);
|
||||||
|
|
||||||
rb_cEnumerator = rb_define_class("Enumerator", rb_cObject);
|
rb_cEnumerator = rb_define_class("Enumerator", rb_cObject);
|
||||||
rb_include_module(rb_cEnumerator, rb_mEnumerable);
|
rb_include_module(rb_cEnumerator, rb_mEnumerable);
|
||||||
|
@ -743,12 +775,9 @@ Init_Enumerator(void)
|
||||||
rb_define_method(rb_cEnumerator, "initialize_copy", enumerator_init_copy, 1);
|
rb_define_method(rb_cEnumerator, "initialize_copy", enumerator_init_copy, 1);
|
||||||
rb_define_method(rb_cEnumerator, "each", enumerator_each, 0);
|
rb_define_method(rb_cEnumerator, "each", enumerator_each, 0);
|
||||||
rb_define_method(rb_cEnumerator, "each_with_index", enumerator_with_index, 0);
|
rb_define_method(rb_cEnumerator, "each_with_index", enumerator_with_index, 0);
|
||||||
|
rb_define_method(rb_cEnumerator, "each_with_object", enumerator_with_object, 1);
|
||||||
rb_define_method(rb_cEnumerator, "with_index", enumerator_with_index, 0);
|
rb_define_method(rb_cEnumerator, "with_index", enumerator_with_index, 0);
|
||||||
#if 0
|
|
||||||
rb_define_method(rb_cEnumerator, "with_object", enumerator_with_object, 1);
|
rb_define_method(rb_cEnumerator, "with_object", enumerator_with_object, 1);
|
||||||
#else
|
|
||||||
(void)enumerator_with_object;
|
|
||||||
#endif
|
|
||||||
rb_define_method(rb_cEnumerator, "next", enumerator_next, 0);
|
rb_define_method(rb_cEnumerator, "next", enumerator_next, 0);
|
||||||
rb_define_method(rb_cEnumerator, "rewind", enumerator_rewind, 0);
|
rb_define_method(rb_cEnumerator, "rewind", enumerator_rewind, 0);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue