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



http://do-aki.net/
PHPer




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




(`・ω・´)
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

More from do_aki

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

More from do_aki (20)

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

Ruby enumerable source code reading