如果在Object < BasicObject
中定义了#superclass
,#class
和Object
,那么class A < BasicObject
如何回答A.superclass
和{{{ 1}? A.class
:A.ancestors
更进一步(根据新答案):
如果[A, BasicObject]
是A
的一个实例,为什么它的祖先没有呢?
Object
Class B;end
B.ancestors # => [B, Object, Kernel, BasicObject]
可能在SuperClass
中定义,但Kernel
在其祖先中没有A
。
Kernel
已包含在Kernel
(来自object.rb
)中:
Object
P.S 这个git issue让我感到很困惑,无法询问它
答案 0 :(得分:3)
这是因为A
(以及BasicObject
)是Class
类的一个实例,其上定义了superclass
,Class
是Object
的子类,其中包含Kernel
,其中定义了class
。
BasicObject.method(:superclass).owner # => Class
BasicObject.method(:class).owner # => Kernel
答案 1 :(得分:2)
class A < BasicObject
end
此处,类 A
本身就是类Class
的一个实例。
A.class
#=> Class
A
对.class
和.superclass
的回答,因为Class
支持它们。
您所考虑的是A
的实例,在这种情况下:
A.new
(Object doesn't support #inspect)
=>
答案 2 :(得分:0)
您的假设不正确。
#class
被定义为Kernel
的实例方法:
From: object.c (C Method):
Owner: Kernel
Visibility: public
Number of lines: 5
VALUE
rb_obj_class(VALUE obj)
{
return rb_class_real(CLASS_OF(obj));
}
和superclass
被定义为Class
的实例方法:
From: object.c (C Method):
Owner: Class
Visibility: public
Number of lines: 17
VALUE
rb_class_superclass(VALUE klass)
{
VALUE super = RCLASS_SUPER(klass);
if (!super) {
if (klass == rb_cBasicObject) return Qnil;
rb_raise(rb_eTypeError, "uninitialized class");
}
while (RB_TYPE_P(super, T_ICLASS)) {
super = RCLASS_SUPER(super);
}
if (!super) {
return Qnil;
}
return super;
}
答案 3 :(得分:0)
BasicObject
有一组实例方法,但它有尽可能多的常见类方法(Class
类的实例方法)其他课程,这就是你可以致电BasicObject.class
的原因。另请注意,BasicObject
本身是Object
,Object
的所有实例都有方法class
,BasicObject
也是如此。