为什么一切都是Ruby中的Class实例?

时间:2014-12-25 15:51:00

标签: ruby

我不太了解Ruby对象模型。首先,Ruby中的一切是Class的实例吗?这些都是真的:

p Object.instance_of?(Class)
p Class.instance_of?(Class)
p Module.instance_of?(Class)
p BasicObject.instance_of?(Class)
class Hello; end
p Hello.instance_of?(Class)

如果ObjectClass的超类,我怎么能理解它是怎么可能的呢?它怎么可能都是Class的超类和它的一个实例同时(Ruby对象模型上的大多数图表清楚地说明了这个层次结构)?这允许像这样的疯狂:

p BasicObject.is_a?(Object) #=> true

其中BasicObject.classClassClass.is_a?(Object)

顺便说一下,使用Ruby 2.0。

3 个答案:

答案 0 :(得分:12)

  

首先,Ruby中的一切是Class的实例吗?

不,并非所有内容都是Class的实例。只有类是Class的实例。

很多事情都不是Class的实例:例如,字符串是String的实例,而不是Class的实例。数组是Array的实例,整数是Integer的实例,浮点数是Float的实例,trueTrueClass的实例,falseFalseClass的实例,nilNilClass的实例,依此类推。

每个类都是Class的实例,就像每个字符串都是String的实例一样。

  

如果ObjectClass的超类,它怎么能同时成为Class的超类和它的实例(Ruby对象模型上的大多数图表清楚说明这个层次结构)?

魔术。

就像大多数其他语言一样,有一些核心实体被假设存在。它们从天而降,凭空出现,神奇地出现。

在Ruby中,其中一些神奇的东西是:

  • Object没有超类,但是你不能定义没有超类的类,隐式直接超类总是Object。 [注意:可能存在Object的实现定义的超类,但最终会有一个没有超类的超类。]
  • ObjectClass的一个实例,它是Object的子类(这意味着间接ObjectObject本身的实例)< / LI>
  • ClassModule的子类,是Class
  • 的一个实例
  • ClassClass
  • 的一个实例

这些都不能用Ruby解释。

BasicObjectObjectModuleClass都需要同时存在,因为它们具有循环依赖关系。

仅仅因为这种关系不能用Ruby代码表达,并不意味着Ruby语言规范不能说它必须如此。由实现者决定如何做到这一点。毕竟,Ruby实现具有对程序员不具备的对象的访问级别。

例如,Ruby实现可以首先创建BasicObject,将其superclass指针及其class指针设置为null

然后,它会创建Object,将superclass指针设置为BasicObject,将class指针设置为null

接下来,它会创建Module,将superclass指针设置为Object,将class指针设置为null

最后,它会创建Class,将superclass指针设置为Module,将class指针设置为null

现在,我们可以覆盖BasicObjectObjectModule&{39}和Class&#39 ; s class指针指向Class,我们已完成。

这很容易从系统外部进行,从内部看起来很奇怪。

答案 1 :(得分:2)

你应该注意到:

p BasicObject.instance_of?(BasicObject) 

打印false

也就是说,表达式BasicObject不是BasicObject的实例,它是其他东西的实例,也就是说,它是一个Class对象,它代表一个对象,保存(例如)类方法,例如new

例如:

p (BasicObject.new()).instance_of?(BasicObject)

打印true

p (BasicObject.new()).instance_of?(Class)

打印false

答案 2 :(得分:0)

您的所有示例都是按定义类别。类也是对象。但你没做的就是看一个班级的实例:

p Object.new.class
p Hello.new.class

类定义对象的形式,根据定义,类是一个类。但是当您将类实例化为对象时,该对象是新类型。但是你仍然可以看到对象的类本身就是Class:

p Hello.new.class.class