• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Ruby enumerable source code reading
 

Ruby enumerable source code reading

on

  • 1,129 views

20120811 るりま読書会 Enumerable編

20120811 るりま読書会 Enumerable編

Statistics

Views

Total Views
1,129
Views on SlideShare
1,128
Embed Views
1

Actions

Likes
4
Downloads
3
Comments
0

1 Embed 1

http://s.deeeki.com 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Ruby enumerable source code reading Ruby enumerable source code reading Presentation Transcript

    • 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_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 が続く
    • array.c => VALUE rb_cArray;hash.c => VALUE rb_cHash;enum.c => VALUE rb_mEnumerable;enumerator.c => VALUE rb_cEnumerator; VALUE rb_eStopIteration;
    • Enumerable を継承してるクラス
    • 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 が続く
    • るりまに載っていない隠しメソッドがあるのでは!?
    • んなもんあるわきゃない(´・ω・`) けど、ちょっとだけキニナルものを発見
    • 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 endendenum.each{|i| p i}# => 1 2 3
    • Enumerator::Yielder sampleenum = Enumerator.new do |yielder| (1..3).each do |i| yielder.yield i endendenum.each{|i| p i}# => 1 2 3
    • 経緯ドキュメント無いから書くよ現在の実装は実験的なもの明文化すると容易に変え難い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?