类的类型和ruby中类的超类有什么区别?

pan*_*rey 1 ruby class class-hierarchy object-model

在写下我一再努力理解红宝石的对象模型后,我现在感到困惑:以下是我的观察.

class Bird
  def speak
   puts "tweet tweet"
  end
end

>> Bird.class
=> Class
>> Class.class
=> Class
>> Class.superclass
=> Module
>> Module.class
=> Class
>> Module.superclass
=> Object
>> Object.class
=> Class
>> Object.superclass
=> nil
>> nil.class
=> NilClass
>> NilClass.class
=> Class
>> NilClass.superclass
=> Object 
and keeps going on ....
Run Code Online (Sandbox Code Playgroud)

这里发生了什么 ?什么位于祖先的顶点nil或NilClass或Object或Class?Ruby的对象模型是如何组织的.

什么是类,什么是对象?是阶级还是对象?是对象还是类?

Ale*_*yne 6

在ruby中,类对象实际上是Class类的一个实例. class Foo几乎完全相同Foo = Class.new

MyClass = Class.new
instance = MyClass.new
puts instance # => #<MyClass:0x100c14b38>
Run Code Online (Sandbox Code Playgroud)

此外,该class方法更多的设计是在实例上调用,而不是类对象.

class Foo
end

f = Foo.new
puts f.class # => Foo
Run Code Online (Sandbox Code Playgroud)

调用类对象时语义可能很奇怪.虽然superclass在类对象上可以正常工作.

所以,只要一个一个地解释这些:

>> Bird.class
=> Class
Run Code Online (Sandbox Code Playgroud)

Bird类对象有一个类Class,因为所有类对象都是类的实例Class.

>> Class.class
=> Class
Run Code Online (Sandbox Code Playgroud)

Class是的甚至是一个实例Class.在这种情况下,它实际上是一个循环引用.

>> Class.superclass
=> Module
Run Code Online (Sandbox Code Playgroud)

Class级实际上是从继承Module.毕竟,类只是一个可以实例化的模块.但是所有非实例功能与模块完全相同.

>> Module.superclass
=> Object
Run Code Online (Sandbox Code Playgroud)

Module继承自Object.就像回到红宝石中的所有东西一样.

>> Object.class
=> Class
Run Code Online (Sandbox Code Playgroud)

同样,所有类对象都是实例Class.

>> Object.superclass
=> nil
Run Code Online (Sandbox Code Playgroud)

所有红宝石一切都始于Object.它是一切的基础类.因此它没有超类.

>> nil.class
=> NilClass
Run Code Online (Sandbox Code Playgroud)

nil实际上是NilClass引擎盖下的一个例子. NilClass定义nil响应的方法.您甚至可以NilClass根据需要添加方法.还有一个TrueClass和一个FalseClass.

>> NilClass.class
=> Class
Run Code Online (Sandbox Code Playgroud)

同样,所有类对象都是实例Class.

>> NilClass.superclass
=> Object
Run Code Online (Sandbox Code Playgroud)

NilClassObject像任何未指定显式超类的类一样继承.