相关疑难解决方法(0)

有人可以解释Class.superclass.class.superclass悖论吗?

它可能根本不是一个悖论,但从新手的角度来看,它看起来确实如此.

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

所以类的父级是模块,但模块是一个类?

我怎么能理解这个?

ruby metaprogramming

28
推荐指数
2
解决办法
1万
查看次数

类/对象悖论的混乱

在"The Well Grounded Rubyist"(摘录)一书中,David Black谈到了"Class/Object Chicken-and-Egg Paradox".我很难理解整个概念.

有人可以用更好/更容易/类比/其他术语来解释它吗?

引用(强调我的):

这个类Class本身就是一个例子; 也就是说,它是一个Class 对象.而且还有更多.还记得上课Object吗?嗯,Object 是一个类...但类是对象.所以,Object是一个对象.而且 Class是一堂课.并且Object是一个类,并且Class是一个对象.

哪个先来?Class除非该类Object已存在,否则如何创建该类?但是,如果有一个类可以有实例,那么怎么会有一个类Object (或任何其他类)Class呢?

处理这个悖论的最好方法,至少就目前来说,是忽略它.为了让类和对象系统运行起来,Ruby必须做一些鸡蛋或鸡蛋的东西 - 然后,循环和悖论并不重要.在编程过程中,您只需要知道类是对象,被调用类的实例 Class.

(如果你想简要地知道它是如何工作的,就像这样:每个对象都有一个内部记录,它是一个实例的类,并且对象内部的记录Class指向它Class.)

ruby

10
推荐指数
1
解决办法
1950
查看次数

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

我不太了解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)
Run Code Online (Sandbox Code Playgroud)

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

p BasicObject.is_a?(Object) #=> true
Run Code Online (Sandbox Code Playgroud)

这里BasicObject.classClassClass.is_a?(Object).

顺便说一句,使用Ruby 2.0.

ruby

5
推荐指数
1
解决办法
345
查看次数

标签 统计

ruby ×3

metaprogramming ×1