加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby的对象模型中首先出现了什么?

发布时间:2020-12-17 03:26:16 所属栏目:百科 来源:网络整理
导读:我一直在阅读Metaprogramming Ruby,对象模型就像鸡或蛋的困境. 在Ruby 1.8中,Object类是Class的一个实例. Module的超类是Object,是Class的一个实例.类的超类是Module,它是Class的一个实例(自引用).说类SomeClass;结束在某处定义; SomeClass是Class的一个实例
我一直在阅读Metaprogramming Ruby,对象模型就像鸡或蛋的困境.

在Ruby 1.8中,Object类是Class的一个实例. Module的超类是Object,是Class的一个实例.类的超类是Module,它是Class的一个实例(自引用).说类SomeClass;结束在某处定义; SomeClass是Class的一个实例,但是它的超类是Object.为什么Class的实例将Object作为超类而不是nil?

此外,如果Object存在,那么Class必须存在,但是Module必须存在,但是对于Module来说,Object必须存在.这些课程是如何创建的?

解决方法

这是一个完整的Ruby类图(适用于Ruby 1.8): http://banisterfiend.wordpress.com/2008/11/25/a-complete-ruby-class-diagram/

为了帮助您理解类图中看似不可能的奇怪的自反性,了解可以在C API中随时分配类指针和超类指针是很有用的.也就是说,您可以创建一个对象(在C API中)并在事后确定Class和Super类指针指向的内容.

另外,要理解定义的顺序,请查看object.c中的Init_Object()(在Ruby 1.9中)

rb_cBasicObject = boot_defclass("BasicObject",0);
rb_cObject = boot_defclass("Object",rb_cBasicObject);
rb_cModule = boot_defclass("Module",rb_cObject);
rb_cClass =  boot_defclass("Class",rb_cModule);

metaclass = rb_make_metaclass(rb_cBasicObject,rb_cClass);
metaclass = rb_make_metaclass(rb_cObject,metaclass);
metaclass = rb_make_metaclass(rb_cModule,metaclass);
metaclass = rb_make_metaclass(rb_cClass,metaclass);
boot_defmetametaclass(rb_cModule,metaclass);
boot_defmetametaclass(rb_cObject,metaclass);
boot_defmetametaclass(rb_cBasicObject,metaclass);

其中rb_cBasicObject是Ruby中的BasicObject,rb_cObject是Ruby中的Object,依此类推.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读