[#43369] dRuby に CGI を渡す→script_uri が上手く取得出来ない — 石井 大海 <banzaida@...>

こんばんは、konnです。

10 messages 2007/04/05

[ruby-list:43428] ClassのクラスはClass自身でない? (RHGの疑問点)

From: Yoshino <ysnmin@...>
Date: 2007-04-12 13:43:09 UTC
List: ruby-list #43428
初めまして。吉野と言います。

青木さんの書かれた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 <ysnmin@gmail.com>

In This Thread

Prev Next