Ruby enumerable source code reading1. Ruby enumerable
source code
reading
2012/08/11
るりま読書会 Enumerator編
do_aki
13. Array => array.c
Hash => hash.c
Enumerable => enum.c
Enumerator => enumerator.c
14. void
Init_Array(void)
array.c
{
rb_cArray = rb_define_class("Array", rb_cObject);
rb_include_module(rb_cArray, rb_mEnumerable);
rb_define_alloc_func(rb_cArray, ary_alloc);
rb_define_singleton_method(rb_cArray, "[]", rb_ary_s_create, -1);
rb_define_singleton_method(rb_cArray, "try_convert",
rb_ary_s_try_convert, 1);
rb_define_method(rb_cArray, "initialize", rb_ary_initialize, -1);
rb_define_method(rb_cArray, "initialize_copy", rb_ary_replace, 1);
rb_define_method(rb_cArray, "inspect", rb_ary_inspect, 0);
rb_define_alias(rb_cArray, "to_s", "inspect");
rb_define_method(rb_cArray, "to_a", rb_ary_to_a, 0);
rb_define_method(rb_cArray, "to_ary", rb_ary_to_ary_m, 0);
rb_define_method(rb_cArray, "frozen?", rb_ary_frozen_p, 0);
以下 rb_define_method が続く
15. array.c
=> VALUE rb_cArray;
hash.c
=> VALUE rb_cHash;
enum.c
=> VALUE rb_mEnumerable;
enumerator.c
=> VALUE rb_cEnumerator;
VALUE rb_eStopIteration;
17. void
Init_Array(void)
array.c
{
rb_cArray = rb_define_class("Array", rb_cObject);
rb_include_module(rb_cArray, rb_mEnumerable);
rb_define_alloc_func(rb_cArray, ary_alloc);
rb_define_singleton_method(rb_cArray, "[]", rb_ary_s_create, -1);
rb_define_singleton_method(rb_cArray, "try_convert",
rb_ary_s_try_convert, 1);
rb_define_method(rb_cArray, "initialize", rb_ary_initialize, -1);
rb_define_method(rb_cArray, "initialize_copy", rb_ary_replace, 1);
rb_define_method(rb_cArray, "inspect", rb_ary_inspect, 0);
rb_define_alias(rb_cArray, "to_s", "inspect");
rb_define_method(rb_cArray, "to_a", rb_ary_to_a, 0);
rb_define_method(rb_cArray, "to_ary", rb_ary_to_ary_m, 0);
rb_define_method(rb_cArray, "frozen?", rb_ary_frozen_p, 0);
以下 rb_define_method が続く
20. Enumerator::Yielder
new {|y| ... } -> Enumerator
Enumerator オブジェクトを生成して返しま
す。与えられたブロックは Enumerator::Yielder
オブジェクトを 引数として実行されます。
生成された Enumerator オブジェクトに対して
each を呼ぶと、この生成時に指定されたブ
ロックを 実行し、Yielder オブジェクトに対し
て << メソッドが呼ばれるたびに、 each に渡
されたブロックが繰り返されます。
new に渡されたブロックが終了した時点で
each の繰り返しが終わります。 このときのブ
ロックの返り値が each の返り値となります。