#4 楼 @chenge 哈哈,我刚写了个帖子,有个图,估计能看清楚一些。 http://www.cnblogs.com/baxiaopeng/archive/2013/04/29/3050497.html
举个列子: class MyClass;end obj=MyClass.new 那么,obj 和 MyClass 都是对象,它们唯一的区别就是,obj 是变量,而 MyClass 是常量。 仅此而已。换句话说,就像类是对象一样,类名无非就是一个常量而已。 MyClass 是对象,所以它也有类,它的类就是 Class,而 Class 的 Class 就是它自己,Class 的 superclass 就是 Module,Module 的 superclass 就是 Object。Object 的 class 就是 Class。
在 ruby 中,类也是一个普通的对象。
单件类就是要特意隐藏起来的。
关于单件类,可以记住一个绕口令:对象的单件类的超类,是这个对象的类;类的单件类的超类,是这个类的超类的单件类。
这似乎是一个关于“作用域门”的问题。ruby 会在三个地方关闭前一个作用域,同时打开一个新的作用域:类定义、模块定义、方法。 当把 class << self 写在 class A 里面时,此时 ruby 关闭了 Object 的作用域门,打开了 class A 的作用域门,由于 A 里面定义了@@a,所以不会报错。如果把 class << self 写在 class A 外面,则此时上下文为 Object,而 Object 中没有定义@@a,所以会报错。换句话说:class << self 并不是作用域门。