为什么`BasicObject`回答方法`superclass`和`class`?

时间:2015-08-05 11:55:50

标签: ruby

如果在Object < BasicObject中定义了#superclass#classObject,那么class A < BasicObject如何回答A.superclass和{{{ 1}? A.classA.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让我感到很困惑,无法询问它

4 个答案:

答案 0 :(得分:3)

这是因为A(以及BasicObject)是Class类的一个实例,其上定义了superclassClassObject的子类,其中包含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本身是ObjectObject的所有实例都有方法classBasicObject也是如此。