From: Yoshino Date: 2007-04-12T22:43:09+09:00 Subject: [ruby-list:43428] ClassのクラスはClass自身でない? (RHGの疑問点) 初めまして。吉野と言います。 青木さんの書かれたRuby Hacking Guideを読んでいて、疑問に思う点 があったので質問させて下さい。(長文失礼します。) 第4章 クラスとモジュール http://www.loveruby.net/ja/rhg/book/class.html 上記ページに、以下のような記述があります。 [クラスの無限連鎖] このことを踏まえて現実に実装することを考えてみよう。まず最 も素朴な方法として、ClassのクラスはClassClass、ClassClass のクラスは ClassClassClass……というふうに、クラスのための クラスを次々と連鎖することが考えられる。しかし論理的にはと もあれ、こんなものは効率的には実装できない。そういうわけで クラスがオブジェクトであるオブジェクト指向言語は、 Classの クラスをClass自身にしてしまうことでループを作りだし、無限 のインスタンス〜クラス関係を仮想的に作りだすのが常套手段な のである。 これを読んで、実際にrubyのソースも見てみて、なるほどと納得して いたのですが、読み終わったあと正誤表ページに以下のように書いて あるのを見つけました。 『Rubyソースコード完全解説』正誤表 http://www.loveruby.net/ja/rhg/errata.html p.128 中程、クラスの連鎖について 「しかし論理的にはともあ れ、こんなものは効率的には実装できない」とあるが、 最新の 1.8 の実装だと「効率的には実装できない」はずの実装になって いる。 つまり効率的に実装できる。 私は、以下のソースから、「ClassのクラスはClass自身」という記述 に納得していました。 [RHG解説対象のruby (1.7.3 2002-09-12) の object.c] 1237 : Init_Object() 略 : 1245 : rb_cClass = boot_defclass("Class", rb_cModule); ⇒ ruby起動時にInit_Object()関数から boot_defclass()関数が コールされ、rb_cClass (= Classクラスの実体) が作成され る。 [同 object.c] 1221 : boot_defclass(name, super) 略 : 1226 : VALUE obj = rb_class_boot(super); 略 : 1231 : return obj; ⇒ boot_defclass()関数は、中でrb_class_boot()関数をコール し、そのreturn値を返却している。rb_class_boot()関数で何 を行っているかというと、 [同 class.c] 22 : rb_class_boot(super) 略 : 25 : NEWOBJ(klass, struct RClass); 26 : OBJSETUP(klass, rb_cClass, T_CLASS); 略 : 34 : return (VALUE)klass; ⇒ NEWOBJでオブジェクトの実体を作成し、OBJSETUPでflagsと klassを設定している。つまり、新規生成したオブジェクト klassのklass->klassにrb_cClassを設定している。そして、 rb_class_boot()関数のreturn値は最終的に、rb_cClassに代 入される。 まとめると "rb_cClass->klass == rb_cClass" となり、前述の 「ClassのクラスはClass自身」という処理が実装されているんだな〜 と思っていました。 このあたりの処理は、RHG解説対象のruby (1.7.3 2002-09-12) でも1. 8.0版rubyでも1.8.6版rubyでも、変わりは無いようです。 しかし正誤表ページには、 最新の 1.8 の実装だと「効率的には実装できない」はずの実装 になっている。 とあり、1.8のrubyでは「ClassのクラスはClassClass」となっている、 と訂正されています。 ということで、最新の (1.8の) rubyにおいて、 ClassのクラスはClass自身? ClassのクラスはClassClass? のどちらが正しいのでしょうか? 参照すべきソースや関数なども、ヒント程度に示して頂けると嬉しい です。よろしくお願いします。 -- Yoshino