メタクラスと Ruby のオブジェクト モデルにおけるメタクラスの位置付けに関するこの投稿には、クラス階層図があります。その中で、Class:Class
(Class
の singleton クラス) はそれ自体のインスタンスですが、 のインスタンスであるべきだと思いますClass
。別の言い方をすれば、class_singletonclass
次のようなオブジェクトがあるとします。
class_singletonclass = Class.singleton_class
# => #<Class:Class>
内部クラスのポインターはどこをklass
指していますか? のクラスメソッド(シングルトンメソッド)を定義したとすると、 の場合、はどこをklass
指しているのか?Class
Class
Class
すでにクラスメソッドが定義されていることに気付きました。Class
これは特別なことであり、MRI には独自の C 実装があるため、クラス メソッドを追加すると適切なメタクラスが作成されると思います。この仮定は間違っていますか?
class.c
MRIで次のことがわかりました。
/*!
* A utility function that wraps class_alloc.
*
* allocates a class and initializes safely.
* \param super a class from which the new class derives.
* \return a class object.
* \pre \a super must be a class.
* \post the metaclass of the new class is Class.
*/
VALUE
rb_class_boot(VALUE super)
{
VALUE klass = class_alloc(T_CLASS, rb_cClass);
RCLASS_SET_SUPER(klass, super);
RCLASS_M_TBL(klass) = st_init_numtable();
OBJ_INFECT(klass, super);
return (VALUE)klass;
}
この行は、のメタクラスが実際にある\post the metaclass of the new class is Class.
ことを示唆しており、これはすべてのメタクラスに当てはまります。Class
Class