ruby - ruby 中类的类型和类的父类(super class)有什么区别?

标签 ruby class class-hierarchy object-model

在写下我反复努力理解 ruby​​ 的对象模型之后,我现在很困惑:以下是我的观察。

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 ....

这是怎么回事?祖先 nil 或 NilClass 或 Object 或 Class 的顶点是什么? Ruby 的对象模型是如何组织的。

什么是类,什么是对象? Class 是一个类还是一个对象?对象是对象还是类?

最佳答案

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

MyClass = Class.new
instance = MyClass.new
puts instance # => #<MyClass:0x100c14b38>

此外,class 方法更适合在实例而不是类对象上调用。

class Foo
end

f = Foo.new
puts f.class # => Foo

调用类对象时语义可能很奇怪。尽管 superclass 可以像您期望的那样在类对象上工作。

鉴于所有这些,让我们一一解释:

>> Bird.class
=> Class

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

>> Class.class
=> Class

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

>> Class.superclass
=> Module

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

>> Module.superclass
=> Object

Module 继承自 Object。如果你回溯得足够远,就像 ruby​​ 中的所有东西一样。

>> Object.class
=> Class

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

>> Object.superclass
=> nil

所有 ruby​​ 一切都以 Object 开头。它是一切的基类。因此它没有父类(super class)。

>> nil.class
=> NilClass

nil 实际上是 NilClass 的一个实例。 NilClass 定义了 nil 响应的方法。如果需要,您甚至可以向 NilClass 添加方法。还有一个 TrueClass 和一个 FalseClass

>> NilClass.class
=> Class

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

>> NilClass.superclass
=> Object

NilClass 像任何未指定显式父类(super class)的类一样从 Object 继承。

关于ruby - ruby 中类的类型和类的父类(super class)有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7264233/

相关文章:

ruby - 如何在 Eclipse 的 ruby​​ 插件中自定义编辑器的背景颜色?

c# - 在运行时更改 C# 中字段的类型

java - 如何测试一个java类是否在运行时扩展了另一个?

Ruby - 换行符和运算符

html - 如何使用Nokogiri获取具有自定义属性的div元素

ruby-on-rails - 瘦服务器进程以 100% CPU 挂起,似乎是一个正则表达式循环。我在哪里可以获得更多调试信息?

c++ - 运算符 '=' must be a nonstatic member function错误

javascript - 如何让函数在创建时调用自己的函数

php - 扩展 PHP 静态类

c++ - 当两个父类(super class)具有同名但签名不同的成员函数时不明确