SlideShare a Scribd company logo
Ruby enumerable
  source code
    reading
2012/08/11
るりま読書会 Enumerator編
                     do_aki
@do_aki



http://do-aki.net/
PHPer




I’m
a PHPer
Ruby enumerable source code reading
Ruby enumerable source code reading
Ruby enumerable source code reading
新たにプログラミング言語
を学ぶ時の効果的な方法
Code
Reading
Ruby のコード読んでやんよ




(`・ω・´)
Ruby enumerable source code reading
Ruby enumerable source code reading
Ruby 言語仕様
組み込みライブラリ

            直下の *.c

標準添付ライブラリ

            ext/lib 以下
Array   => array.c
   Hash    => hash.c
Enumerable => enum.c
Enumerator => enumerator.c
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 が続く
array.c
      => VALUE rb_cArray;
hash.c
      => VALUE rb_cHash;
enum.c
      => VALUE rb_mEnumerable;
enumerator.c
      => VALUE rb_cEnumerator;
         VALUE rb_eStopIteration;
Enumerable を継承してるクラス
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 が続く
るりまに載っていない
隠しメソッドがあるのでは!?
んなもんあるわきゃない




(´・ω・`)
      けど、ちょっとだけキニナルものを発見
Enumerator::Yielder
new {|y| ... } -> Enumerator
Enumerator オブジェクトを生成して返しま
す。与えられたブロックは Enumerator::Yielder
オブジェクトを 引数として実行されます。
生成された Enumerator オブジェクトに対して
each を呼ぶと、この生成時に指定されたブ
ロックを 実行し、Yielder オブジェクトに対し
て << メソッドが呼ばれるたびに、 each に渡
されたブロックが繰り返されます。
new に渡されたブロックが終了した時点で
each の繰り返しが終わります。 このときのブ
ロックの返り値が each の返り値となります。
Enumerator::Yielder sample
enum = Enumerator.new do |yielder|
    (1..3).each do |i|
        yielder << i
    end
end

enum.each{|i| p i}
# => 1
     2
     3
Enumerator::Yielder sample
enum = Enumerator.new do |yielder|
    (1..3).each do |i|
        yielder.yield i
    end
end

enum.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?

More Related Content

Similar to Ruby enumerable source code reading (20)

ODP
Rubyのソースコードを読んでみよう(入門編)
baban ba-n
 
PDF
怠惰なRubyistへの道 fukuoka rubykaigi01
nagachika t
 
PDF
Ruby初級者向けレッスン 56回 ─── ブロック
higaki
 
PDF
Enumerable lazy について
Tomoya Kawanishi
 
PDF
Ruby
Shintaro Abe
 
PDF
怠惰なRubyistへの道
nagachika t
 
PPTX
Ruby講座第二回
mitsunaga
 
PDF
フィボナッチ数列の作り方
Tomoya Kawanishi
 
PDF
Evolution Of Enumerator
Akinori Musha
 
ODP
Rubyのコードを読んでみよう(オブジェクト編)
baban ba-n
 
PDF
Tottoruby 20130119
Takashi SAKAGUCHI
 
PDF
Ruby初級者向けレッスン 50回 ─── ブロック
higaki
 
PDF
Ruby初級者向けレッスン KOF2015 出張版
higaki
 
KEY
Enumerable な何か、あるいは怠惰なる反復
Tadashi Sawada
 
PDF
Ruby でつくる型付き Ruby
mametter
 
PDF
Fukushima.rb#00
xibbar
 
PDF
Ruby 同好会宣言
Yuya Takeyama
 
PPTX
第3回輪講
mh_amako
 
PDF
Rubyist生活に欠かせないブロック構文の話
Kohei Taniguchi
 
PDF
RubyKaigi2014: Just in Time compiler for CRuby
imasahiro
 
Rubyのソースコードを読んでみよう(入門編)
baban ba-n
 
怠惰なRubyistへの道 fukuoka rubykaigi01
nagachika t
 
Ruby初級者向けレッスン 56回 ─── ブロック
higaki
 
Enumerable lazy について
Tomoya Kawanishi
 
怠惰なRubyistへの道
nagachika t
 
Ruby講座第二回
mitsunaga
 
フィボナッチ数列の作り方
Tomoya Kawanishi
 
Evolution Of Enumerator
Akinori Musha
 
Rubyのコードを読んでみよう(オブジェクト編)
baban ba-n
 
Tottoruby 20130119
Takashi SAKAGUCHI
 
Ruby初級者向けレッスン 50回 ─── ブロック
higaki
 
Ruby初級者向けレッスン KOF2015 出張版
higaki
 
Enumerable な何か、あるいは怠惰なる反復
Tadashi Sawada
 
Ruby でつくる型付き Ruby
mametter
 
Fukushima.rb#00
xibbar
 
Ruby 同好会宣言
Yuya Takeyama
 
第3回輪講
mh_amako
 
Rubyist生活に欠かせないブロック構文の話
Kohei Taniguchi
 
RubyKaigi2014: Just in Time compiler for CRuby
imasahiro
 

More from do_aki (20)

PPTX
Tritonn から Elasticsearch への移行話
do_aki
 
PPTX
php-src の歩き方
do_aki
 
PPTX
PHP と SAPI と ZendEngine3 と
do_aki
 
PPTX
PHPとシグナル、その裏側
do_aki
 
PPTX
再考:列挙型
do_aki
 
PPTX
signal の話 或いは Zend Signals とは何か
do_aki
 
PPTX
PHP AST 徹底解説(補遺)
do_aki
 
PPTX
PHP AST 徹底解説
do_aki
 
PPTX
Writing php extensions in golang
do_aki
 
PPTX
php7's ast
do_aki
 
PPTX
N対1 レプリケーション + Optimizer Hint
do_aki
 
PPTX
20150212 プレゼンテーションzen
do_aki
 
PPTX
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
do_aki
 
PPTX
20141017 introduce razor
do_aki
 
PPTX
20141011 mastering mysqlnd
do_aki
 
PPTX
php in ruby
do_aki
 
PPTX
PHP から Groonga を使うにはこんなコードになるよ!
do_aki
 
PPTX
N:1 Replication meets MHA
do_aki
 
PDF
Php radomize
do_aki
 
PPTX
php and sapi and zendengine2 and...
do_aki
 
Tritonn から Elasticsearch への移行話
do_aki
 
php-src の歩き方
do_aki
 
PHP と SAPI と ZendEngine3 と
do_aki
 
PHPとシグナル、その裏側
do_aki
 
再考:列挙型
do_aki
 
signal の話 或いは Zend Signals とは何か
do_aki
 
PHP AST 徹底解説(補遺)
do_aki
 
PHP AST 徹底解説
do_aki
 
Writing php extensions in golang
do_aki
 
php7's ast
do_aki
 
N対1 レプリケーション + Optimizer Hint
do_aki
 
20150212 プレゼンテーションzen
do_aki
 
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
do_aki
 
20141017 introduce razor
do_aki
 
20141011 mastering mysqlnd
do_aki
 
php in ruby
do_aki
 
PHP から Groonga を使うにはこんなコードになるよ!
do_aki
 
N:1 Replication meets MHA
do_aki
 
Php radomize
do_aki
 
php and sapi and zendengine2 and...
do_aki
 
Ad

Ruby enumerable source code reading