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

这可能不是一个悖论,但从新手的角度来看,它肯定似乎这样。

> Class.superclass
=> Module
> Class.superclass.class
=> Class
> Class.superclass.class.superclass
=> Module

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

我怎么能理解这个?

TL; DR:Module是Class的超类。模块是Class的一个实例。

让我尝试更清楚地解释它。请原谅我的手写图纸 – 我没有任何花哨的绘图软件。

Ruby中的每个类都有1个超类*。

*除了BasicObject,它没有超类。

读取上面的图形如下:Float的超类是Numeric。 Numeric的超类是Object等…

当你实例化一个对象时,该对象将是一个类的实例。例如,“Nathan”是String类的一个实例。因此是“Joe”或“John”。 1是Fixnum类的一个实例,如2,3,4等等…

阅读上面的图形,像这样:“Joe”是String的一个实例。 1是Fixnum等的实例…

嗯,在Ruby中,与大多数其他语言不同,Class只是另一个类,它也可以被实例化,就像Fixnum或String。

阅读上面的图形,像这样:0.01是一个Float的实例。 String是Class的实例等…

意识到Fixnum是一个类的实例,就像“Nathan”是String的一个实例。就像“John”是String的一个实例,Float只是一个Class的实例。每个类只是一个类的实例,甚至类本身!

每当你在你的应用程序中写一个新类时,你只是实例化一个类是Class的新对象,就像Hash.new实例化一个新的Hash,或者“Nathan”实例化一个新的String。

# By running this, you will be instantiating a new Class, and 
# it will be named Post 
class Post < ActiveRecord::Base
end

# Here is another perfectly valid way to write the above code:
Post = Class.new(ActiveRecord::Base)

# you can even instantiate a Class without giving it an explicit name:
x = Class.new(ActiveRecord::Base)

# and since your new things are classes, they can be instantiated
obj1 = Post.new
obj2 = x.new

此外,Module只是Class的另一个实例。每当你在你的应用程序中写一个新模块,你只是实例化一个新的模块。

# this will instantiate a new Module, and assign it to Foo
module Foo
end

# Here is another perfectly valid way to write the above code:
Foo = Module.new

# you can even instantiate a Module without giving it an explicit name.
m = Module.new

另一方面:模块只是方法和常量的集合。类也是方法和常量的集合,但具有能够实例化的附加功能。模块不能实例化。也就是说,m.new将不工作。

所以,回头看上面的图形,你的问题可以直接回答:

So a class’s parent is module, but module is a class?

你可以从顶部的图形看到:Module是Class的超类。

从底部的图形:Module是Class的一个实例。

http://stackoverflow.com/questions/10558504/can-someone-explain-the-class-superclass-class-superclass-paradox

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:ruby – 有人可以解释Class.superclass.class.superclass悖论吗?