Ruby的类和对象

时间:2014-08-25 00:37:40

标签: ruby

我已经阅读了很多关于ruby类和对象的内容,我得出了这个结论

有一个名为“class”的概念,我们有以下类:

BasicObject

的超类
Object 

的超类
Module

的超类
Class

这样:

  1. “class”Class是“class”的子类Object

  2. 因为以上所有“类,模块,对象,基本对象”都是“类”概念的实例。 Instance_of? Class会 对所有人都返回

  3. 另一方面,(Object.new).instance_of? Class将返回false,因为(Object.new)是“class”的实例Object
  4. 的问题:

    • Class.is_a? Object是正确的,因为ClassObject的子类,但Object.is_a? Class也返回true,因为Class在这里指的是更大的类概念吗?如果是这样的话?是不是很混乱?我怎么知道哪个班级是哪个?

2 个答案:

答案 0 :(得分:1)

你有几件事情错了。

  • (2。)原因ClassModuleObjectBasic ObjectClass的实例,不是因为Class < Module < Object < BasicObject。它与它无关。
  • (3。)(Object.new).instance_of? Class不返回false,因为Object.newObject的实例。这是因为它不是Class的实例。
  • Class.is_a? Object true不是因为[提到的] ClassObject的子类。这是因为(提到的)ClassClass的实例(未提及),它是Object的子类。

问题的答案是:Object.is_a? Class返回true,因为ObjectClass的实例。

如果您想了解实例的类,请使用instance_of?class方法。

3.is_a?(Object) # => false
3.is_a?(Fixnum) # => true
3.class # => Fixnum

答案 1 :(得分:-1)

真正意义上的是Ruby在作弊。 Matz想要在设计Ruby时复制smalltalk的优雅,即规则

  

一切都是对象。

更具技术性

  

所有内容都是Object类或其子类之一的实例。

但是,正如您所见,这条简单的规则会导致一些令人困惑的情况。所有这些疯狂如何运作?就像我说的,它作弊。 Ruby解释器被硬编码以欺骗某些关系,因此“一切都是对象的黄金法则”#34; 看起来就像它没有破坏一样。这里直接来源:

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);
}

在源代码中还有很多案例,其中内置类需要特殊处理,以便给出最不令人惊讶的&#34;结果。基本上,当涉及抽象这样的内部事物时,不要担心它。假设事情会按预期运作。