Ruby 对象模型 - 一个类的祖先

标签 ruby

我正在学习“Metaprogramming Ruby”一书中的 Ruby 对象模型,并且我也了解类如何成为对象的概念。

class A
end

A.ancestors # => [A, Object, Kernel, BasicObject]
A.class.ancestors # => [Class, Module, Object, Kernel, BasicObject]

我感到困惑的是,当我最初在 irb 中尝试 A.ancestors 时,我期望我在 A.class.ancestors 中得到的结果 - 我的思考过程是:因为 A 是一个类,而一个类是类Class的一个实例,它的祖先是Class。但是Class好像不是A的祖先。

有人能在这里消除我的困惑吗?

最佳答案

AClass 的实例,您可以通过 A.class 看到它

A 实例的类是 A,您可以通过 a = A.new; 访问它; a.类

ancestors 方法显示该类的对象具有(或将具有)作为其继承的类层次结构。

在您的示例中有两个平行类层次结构模型,它们相互影响,因为 Ruby 将其类表示为供您检查和修改的对象.

根本没有理由需要 A.class.ancestors 和 A.ancestors 相交——除了 Ruby 也有一个具有简单根的深层类模型,所以在实践中你会看到这一点。

事实上我找不到任何反例,即使是 nil 也这样做:

NilClass.ancestors
 => [NilClass, Object, Kernel, BasicObject]

NilClass.class.ancestors
 => [Class, Module, Object, Kernel, BasicObject]

不过这个更有启发性:

BasicObject.ancestors
 => [BasicObject]

BasicObject.class.ancestors
 => [Class, Module, Object, Kernel, BasicObject]

关于Ruby 对象模型 - 一个类的祖先,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15433378/

相关文章:

ruby - 如何在 ruby​​ 中安装、要求和使用 gem

ruby-on-rails - 如何让 Capistrano 在部署中包含 .htaccess 文件?

ruby-on-rails - rails : Check has_many in View

ruby-on-rails - Rails 生成 Controller (在命名空间下)

ruby - 如何使用 Twitter gem 回复推文?

ruby - self 包含在模块中

ruby-on-rails - 未定义方法 `parent' 为 nil :NilClass

ruby - 是否有内置方法或 gem 可以按列打印 Ruby 数组?

ruby - 使用 ruby​​ 创建 sqlite 数据库需要很长时间

Ruby:如果为真或则获取值