ruby - Class.superclass = 模块,Module.class = 类?

标签 ruby

这是如何计算的?是圆形的

更新: (在 irb 中)

Class.superclass = Module
Module.class = Class

当 Class 是 Modules 的下类时,怎么可能说 Module 的类是 Class?它是圆形的,先有鸡还是先有蛋。

对象:同样的问题:对象是对象模型中的根对象。它的类怎么可能是Class,因为Class对象还不存在呢?

最佳答案

我们来看一下MRI源码的class.c文件:

void Init_class_hierarchy(void)
{
    id_attached = rb_intern("__attached__");

    rb_cBasicObject = boot_defclass("BasicObject", 0);
    /* boot_defclass is defined as boot_defclass(const char *name, VALUE super) */
    rb_cObject = boot_defclass("Object", rb_cBasicObject);
    rb_cModule = boot_defclass("Module", rb_cObject);
    rb_cClass =  boot_defclass("Class",  rb_cModule);

    /* Very important line: */
    RBASIC(rb_cClass)->klass
          = RBASIC(rb_cModule)->klass
          = RBASIC(rb_cObject)->klass
          = RBASIC(rb_cBasicObject)->klass
          = rb_cClass;
 }

ruby.h 中的这些定义也非常重要:

#define R_CAST(st)   (struct st*)
#define RBASIC(obj)  (R_CAST(RBasic)(obj))
#define ROBJECT(obj) (R_CAST(RObject)(obj))
#define RCLASS(obj)  (R_CAST(RClass)(obj))
#define RMODULE(obj) RCLASS(obj)

请注意,ObjectModuleClass 均派生自BasicObject。确实,

irb(main):001:0> BasicObject.superclass
=> nil

这些对象是同时定义的,并且它们都具有 RBASIC(*)->klass = rb_cClass

关于ruby - Class.superclass = 模块,Module.class = 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5768065/

相关文章:

ruby - Array#first 的 block 参数有什么作用?

ruby - 为什么 Ruby 'require' 不允许相对路径?

ruby-on-rails - Rails 模型方法 : which is preferable?

ruby - "<<-"在 Ruby 中是什么意思?

Ruby min 函数不选择最短的字符串

ruby - 一行 if-then 没有 else 子句

java - jruby 根据带有省略号的长度修剪字符串

ruby - 使用 Xcode 4.3.1 在 Mac 上更新 Ruby 时出现问题

ruby-on-rails - OVH 的 OpenStack Swift 的雾配置

ruby-on-rails - 城市/国家文本字段验证