【问题标题】:Ruby's Classes and ObjectsRuby 的类和对象
【发布时间】:2014-08-25 00:37:40
【问题描述】:

我已经阅读了很多关于 ruby​​ 类与对象的信息,我得出了这个结论

有一个概念叫做“类”,我们有以下类:

BasicObject

它是

的超类
Object 

这是

的超类
Module

它是

的超类
Class

所以:

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

  2. 因为上面所有的“类、模块、对象、基本对象”都是“类”概念的实例。 Instance_of? Class会 全部返回 true

  3. 另一方面,(Object.new).instance_of? Class 将返回 false,因为 (Object.new) 是“类”Object 的一个实例

问题:

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

【问题讨论】:

  • “大类概念”是什么意思?
  • 就像“类”是“对象”与“类”的子类,其中一切都是一个类,包括“对象”......这有意义吗?
  • 只有一个类。 this question and its answers 似乎回答了你的问题?

标签: ruby


【解决方案1】:

你有几件事错了。

  • (2.) ClassModuleObjectBasic ObjectClass 的实例的原因不是因为 Class < Module < Object < BasicObject。与此无关。
  • (3.) (Object.new).instance_of? Class 返回 false 不是因为 Object.newObject 的一个实例。这是因为它不是Class 的实例。
  • Class.is_a? Objecttrue 不是因为[提到的] 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

【讨论】:

    【解决方案2】:

    真正发生的是 Ruby 在作弊。 Matz 在设计 Ruby 时想复制 smalltalk 的优雅,即规则

    一切都是对象。

    更专业地说

    一切都是Object 类或其子类之一的实例。

    但是,正如您所见,这条简单的规则会导致一些令人困惑的情况。所有这些疯狂是如何运作的?就像我说的,它作弊。 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 语言只有热爱。事情的真相是,它极其优雅的对象模型只能通过使用 hack 来绕过其实际实现的限制来实现。如果您能想出更好的方法来描述解释器强制结果以呈现一致性,请随时编辑我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 2013-03-24
    • 1970-01-01
    相关资源
    最近更新 更多