Ruby enumerable  source code    reading2012/08/11るりま読書会 Enumerator編                     do_aki
@do_akihttp://do-aki.net/
PHPerI’ma PHPer
新たにプログラミング言語を学ぶ時の効果的な方法
CodeReading
Ruby のコード読んでやんよ(`・ω・´)
Ruby 言語仕様組み込みライブラリ            直下の *.c標準添付ライブラリ            ext/lib 以下
Array   => array.c   Hash    => hash.cEnumerable => enum.cEnumerator => enumerator.c
voidInit_Array(void)                                                   array.c{   rb_cArray = rb_define_class("Array", rb_...
array.c      => VALUE rb_cArray;hash.c      => VALUE rb_cHash;enum.c      => VALUE rb_mEnumerable;enumerator.c      => VAL...
Enumerable を継承してるクラス
voidInit_Array(void)                                                   array.c{   rb_cArray = rb_define_class("Array", rb_...
るりまに載っていない隠しメソッドがあるのでは!?
んなもんあるわきゃない(´・ω・`)      けど、ちょっとだけキニナルものを発見
Enumerator::Yieldernew {|y| ... } -> EnumeratorEnumerator オブジェクトを生成して返します。与えられたブロックは Enumerator::Yielderオブジェクトを 引数として実行されま...
Enumerator::Yielder sampleenum = Enumerator.new do |yielder|    (1..3).each do |i|        yielder << i    endendenum.each{...
Enumerator::Yielder sampleenum = Enumerator.new do |yielder|    (1..3).each do |i|        yielder.yield i    endendenum.ea...
経緯ドキュメント無いから書くよ現在の実装は実験的なもの明文化すると容易に変え難いYieldable module という案は?そこまでする必要なくね?じゃぁいっか。      http://ruby.11.n6.nabble.com/ruby-...
よーわからん  てか、そのへんドキュメントに書いとけよ
時間切れ的まとめ的な何か• 処理系読んでみると面白いよ• コード自体は ruby script っぽい感じ   => ruby に慣れた人は読みやすいハズ• より深く ruby を知ることができる
ありがとうございました
Question?
Ruby enumerable source code reading
Ruby enumerable source code reading
Ruby enumerable source code reading
Ruby enumerable source code reading
Ruby enumerable source code reading
Upcoming SlideShare
Loading in …5
×

Ruby enumerable source code reading

1,324 views

Published on

20120811 るりま読書会 Enumerable編

0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,324
On SlideShare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
5
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Ruby enumerable source code reading

  1. 1. Ruby enumerable source code reading2012/08/11るりま読書会 Enumerator編 do_aki
  2. 2. @do_akihttp://do-aki.net/
  3. 3. PHPerI’ma PHPer
  4. 4. 新たにプログラミング言語を学ぶ時の効果的な方法
  5. 5. CodeReading
  6. 6. Ruby のコード読んでやんよ(`・ω・´)
  7. 7. Ruby 言語仕様組み込みライブラリ 直下の *.c標準添付ライブラリ ext/lib 以下
  8. 8. Array => array.c Hash => hash.cEnumerable => enum.cEnumerator => enumerator.c
  9. 9. voidInit_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 が続く
  10. 10. array.c => VALUE rb_cArray;hash.c => VALUE rb_cHash;enum.c => VALUE rb_mEnumerable;enumerator.c => VALUE rb_cEnumerator; VALUE rb_eStopIteration;
  11. 11. Enumerable を継承してるクラス
  12. 12. voidInit_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 が続く
  13. 13. るりまに載っていない隠しメソッドがあるのでは!?
  14. 14. んなもんあるわきゃない(´・ω・`) けど、ちょっとだけキニナルものを発見
  15. 15. Enumerator::Yieldernew {|y| ... } -> EnumeratorEnumerator オブジェクトを生成して返します。与えられたブロックは Enumerator::Yielderオブジェクトを 引数として実行されます。生成された Enumerator オブジェクトに対してeach を呼ぶと、この生成時に指定されたブロックを 実行し、Yielder オブジェクトに対して << メソッドが呼ばれるたびに、 each に渡されたブロックが繰り返されます。new に渡されたブロックが終了した時点でeach の繰り返しが終わります。 このときのブロックの返り値が each の返り値となります。
  16. 16. Enumerator::Yielder sampleenum = Enumerator.new do |yielder| (1..3).each do |i| yielder << i endendenum.each{|i| p i}# => 1 2 3
  17. 17. Enumerator::Yielder sampleenum = Enumerator.new do |yielder| (1..3).each do |i| yielder.yield i endendenum.each{|i| p i}# => 1 2 3
  18. 18. 経緯ドキュメント無いから書くよ現在の実装は実験的なもの明文化すると容易に変え難い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
  19. 19. よーわからん てか、そのへんドキュメントに書いとけよ
  20. 20. 時間切れ的まとめ的な何か• 処理系読んでみると面白いよ• コード自体は ruby script っぽい感じ => ruby に慣れた人は読みやすいハズ• より深く ruby を知ることができる
  21. 21. ありがとうございました
  22. 22. Question?

×