IRB 和 Ruby 对象模型

3

我是一名想要了解Ruby对象模型的初学者。

在IRB中,我创建了一个名为MyClass的类,并开始检查对象模型,代码如下:

    2.1.0p0 :013 > MyClass.class
     => Class
    2.1.0p0 :014 > MyClass.superclass
     => Object 
    2.1.0p0 :015 > Class.class
     => Class 
    2.1.0p0 :016 > Class.superclass
     => Module 
    2.1.0p0 :017 > Object.class
     => Class 
    2.1.0p0 :018 > Object.superclass
     => BasicObject 
    2.1.0p0 :019 > BasicObject.class
     => Class 
    2.1.0p0 :020 > BasicObject.superclass
     => nil

问题1

MyClass.class == Class.class返回true时,为什么Myclass.superclassClass.superclass不同呢?

    2.1.0p0 :021 > Class.class == MyClass.class
     => true

换句话说:它们的超类为什么不同?

问题2

这个图示准确吗? 图示链接

提前感谢您。


请查看此链接 https://dev59.com/Z2Mk5IYBdhLWcg3wtQBd#19045339 以了解对象模型。 - Arup Rakshit
2
@ArupRakshit 先生,迄今为止这是关于该主题的最佳解释。非常感谢。 - sargas
你可以使用Module#ancestors轻松展示这些关系:MyClass.ancestors => [MyClass, Object, Kernel, BasicObject]Class.ancestors => [Class, Module, Object, Kernel, BasicObject] - Cary Swoveland
我一直觉得这个链接非常有帮助:http://www.hokstad.com/ruby-object-model.html - Michael Kohl
1个回答

0
在Ruby中,类也是对象,这就是为什么类的类实际上是Class的原因。
这就解释了为什么:
Class.class   #=> Class
MyClass.class #=> Class
Class.class == MyClass.class #=> true

你没有在每个类的实例上调用 class,而是在类本身上调用它。这几乎与以下内容相同:

"hey".class  #=> String
"jude".class #=> String
"hey".class == "jude".class #=> true

以下是您可能一开始期望的内容:

MyClass.new.class #=> MyClass
Class.new.class   #=> Class
MyClass.new.class == Class.new.class #=> false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接