Ruby的类和对象

Ruby的类和对象,ruby,Ruby,我读了很多关于ruby类和对象的文章,得出了这个结论 有一个称为类的概念,我们有以下类: BasicObject 哪个是超类 Object Class 哪个是超类 Module 哪个是超类 Object Class 因此: 类是类对象的一个子类 因为上面所有的类、模块、对象、基本对象都是类概念的实例。例如?班级意志 为所有这些返回true 另一方面,Object.new.instance_的?类将返回false,因为Object.new是类对象的实例 问题: 班。你是a吗?Obj

我读了很多关于ruby类和对象的文章,得出了这个结论

有一个称为类的概念,我们有以下类:

BasicObject
哪个是超类

Object 
Class
哪个是超类

Module
哪个是超类

Object 
Class
因此:

类是类对象的一个子类

因为上面所有的类、模块、对象、基本对象都是类概念的实例。例如?班级意志 为所有这些返回true

另一方面,Object.new.instance_的?类将返回false,因为Object.new是类对象的实例 问题:

班。你是a吗?Object为true,因为类是Object的子类,但Object?类也返回true,这是因为这里的类指的是更大的类概念吗?如果是,为什么?这难道不令人困惑吗?我怎么知道哪个班是哪个班?
你有几件事做错了

2.类、模块、对象和基本对象是类实例的原因并不是因为类 如果您想知道实例的类,请使用的实例_?或类方法


真正的原因是Ruby在作弊。Matz在设计Ruby时想模仿smalltalk的优雅,即规则

一切都是对象

更严格地说

一切都是对象类或其子类的实例

然而,正如您所看到的,这个简单的规则会导致一些混乱的情况。所有这些疯狂是怎么起作用的?就像我说的,它作弊。Ruby解释器被硬编码为在某些关系上撒谎,因此所有事物的黄金法则都是一个对象看起来是完整的。这里是直接来源:

void Init_class_hierarchy(void)
{
    /* the normal hierarchy we know and love */
    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);

    /* sneaky stuff to force consistent behavior!!! */
    rb_const_set(rb_cObject, rb_intern_const("BasicObject"), rb_cBasicObject);
    RBASIC_SET_CLASS(rb_cClass, rb_cClass);
    RBASIC_SET_CLASS(rb_cModule, rb_cClass);
    RBASIC_SET_CLASS(rb_cObject, rb_cClass);
    RBASIC_SET_CLASS(rb_cBasicObject, rb_cClass);
}

在源代码中有更多的情况下,内置类需要特殊处理,以得到最不令人惊讶的结果。基本上,当它归结到像这样抽象的内部事物时,不要担心它。假设一切都会按预期进行。

你说的“更大的类概念”是什么意思?比如类是对象的子类,而类是包含对象的类。。。这有意义吗?只有一门课。它似乎回答了你的问题吗?被否决是因为你对一种编程语言使用了很多荒谬的价值判断。请考虑编辑诸如欺骗或说谎之类的单词,并坚持语调中性的语言力学解释。谢谢,嗯。。。什么我只喜欢Ruby语言。事情的真相是,它完美优雅的对象模型只有通过使用黑客来绕过其实际实现的局限性才能实现。如果你能想出一个更好的方法来描述解释器,请随意编辑我的答案,以使结果具有一致性。