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

こんばんは、konnです。

10 messages 2007/04/05

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

From: "Makoto Inada" <mak@...>
Date: 2007-04-16 14:53:32 UTC
List: ruby-list #43441
稲田です。

Revision 2887 の変更とは class.c の rb_make_metaclass() に対する変更のことですよね。
Class の特異クラスのクラスは、この変更に関わらず Class の特異クラス自身だと思います。

Revision 2887 以前、例えば Rev 2886 では、class.c の 151 行目で

        RBASIC(klass)->klass = klass;

と、直接自身が代入されているので、klass (ここでは Class のクラス) のクラスが klass 自身であることは明確です。

1.8.6 のコードはもっと複雑で、


163: VALUE metasuper = RBASIC(rb_class_real(super))->klass;

165: /* metaclass of a superclass may be NULL at boot time */
166: if (metasuper) {
167:     RBASIC(klass)->klass = metasuper;
168:}

klass (ここでは Class のクラス) のクラスには metasuper が代入されています。metasuper は
RBASIC(rb_class_real(super))->klass なんですが、これがどのクラスをさしているかというと、

1. super は Module のクラス(仮にAと呼びます)
2. rb_class_real(A) は A の真のクラス(特異クラスを含めない)を返す。Module のクラスの真のクラスは Class。(B)
3. RBASIC(B)->klass は B のクラスを表す。B は Class だから、これは Class のクラス。
4. Class のクラスは、rb_make_metaclass() 関数内で klass に初期化されている。
5. したがって klass (Class のクラス) のクラスは klass 自身になる。

クラスと Class と klass がでてきたり、Class がオブジェクトだったり、特異クラスと "real"
クラスがあったり、このあたりは本当にややこしいです。



On 4/16/07, Yoshino <ysnmin@gmail.com> wrote:
>
> 吉野です。
>
> 稲田さん、ご返信ありがとうございます。
>
> >Class のクラスは Module のクラスをスーパークラスに持つ特異クラスです。
>
> RHGの該当部分の記述が、
>   ClassのクラスはClass自身
> となっているため、今回は特異クラスを無視していました。
>
> 特異クラスを考慮に入れるなら、稲田さんの仰る通り、「Classのク
> ラスは特異クラス」となるはずですので。
>
> 特異クラス生成の関数は、RHG対象の1.7.3rubyと最新の1.8.6rubyで
> 多少修正されていますが、やはり「ClassのクラスはClassClass、
> ClassClassのクラスは ClassClassClass」という文章の疑問を解くに
> は至りませんでした。
>
> # Classの特異クラスに関してだけ言及すると、
> #   1.7.3ruby
> #     * Classの特異クラスのクラスは、特異クラス自身
> #   1.8.6ruby
> #     * Classの特異クラスのクラスは、Class (= rb_cClass)
> # と変更されたようです。(Revision 2887 の変更)
>
> もしかしたら何か初歩的な勘違いをしているかも知れないので、もう
> 一度RHGとrubyソースを読み直してみたいと思います。
>
> --
> Yoshino <ysnmin@gmail.com>
>
>

In This Thread