ruby enumerable source code reading
Post on 15-Jan-2015
926 Views
Preview:
DESCRIPTION
TRANSCRIPT
Ruby enumerable source code
reading2012/08/11るりま読書会 Enumerator 編
do_aki
@do_aki
http://do-aki.net/
PHPer
I’m a PHPer
閑話休題
新たにプログラミング言語を学ぶ時の効果的な方法
Code Reading
Ruby のコード読んでやんよ
( `・ ω ・ ´)
ruby-1.9.3-
p194
直下の *.c
Ruby 言語仕様組み込みライブラリ
標準添付ライブラリ
ext/lib 以下
=> array.c=> hash.c=> enum.c=> enumerator.c
ArrayHash
EnumerableEnumerator
array.cvoidInit_Array(void){ 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 が続く
Global Objectsarray.c
=> VALUE rb_cArray;hash.c
=> VALUE rb_cHash;enum.c
=> VALUE rb_mEnumerable; enumerator.c
=> VALUE rb_cEnumerator; VALUE rb_eStopIteration;
Enumerable を継承してるクラス
おまけ
array.cvoidInit_Array(void){ 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 が続く
るりまに載っていない隠しメソッドがあるのでは!?
んなもんあるわきゃない
( ´ ・ ω ・`)けど、ちょっとだけ ものを発見キニナル
Enumerator::Yieldernew {|y| ... } -> EnumeratorEnumerator オブジェクトを生成して返します。与えられたブロックは Enumerator::Yielder オブジェクトを 引数として実行されます。生成された Enumerator オブジェクトに対して each を呼ぶと、この生成時に指定されたブロックを 実行し、 Yielder オブジェクトに対して << メソッドが呼ばれるたびに、 each に渡されたブロックが繰り返されます。new に渡されたブロックが終了した時点で each の繰り返しが終わります。 このときのブロックの返り値が each の返り値となります。
Enumerator::Yielder sampleenum = Enumerator.new do |
yielder| (1..3).each do |i| yielder << i endend
enum.each{|i| p i}# => 1 2 3
Enumerator::Yielder sampleenum = Enumerator.new do |
yielder| (1..3).each do |i| yielder.yield i endend
enum.each{|i| p i}# => 1 2 3
UNDOCUMENTED!!!
経緯ドキュメント無いから書くよ
現在の実装は実験的なもの明文化すると容易に変え難い
じゃぁいっか。
そこまでする必要なくね?
Yieldable module という案は?
http://ruby.11.n6.nabble.com/ruby-dev-39660-Bug-trunk-Enumerator-new-y-y-lt-lt-1-lt-lt-2-lt-lt-3-td3535850.html
よーわからん
てか、そのへんドキュメントに書いとけよ
時間切れ的まとめ的な何か
• 処理系読んでみると面白いよ
• コード自体は ruby script っぽい感じ=> ruby に慣れた人は読みやすい
ハズ
• より深く ruby を知ることができる
ありがとうございました
Question?
top related