From: Makoto Inada Date: 2007-04-16T23:53:32+09:00 Subject: [ruby-list:43441] Re: ClassのクラスはClass自身でない? (RHGの疑問点) ------=_Part_1001_18212398.1176735209772 Content-Type: text/plain; charset=ISO-2022-JP; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline 稲田です。 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 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 > > ------=_Part_1001_18212398.1176735209772 Content-Type: text/html; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit Content-Disposition: inline
稲田です。
 
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>


------=_Part_1001_18212398.1176735209772--