Ruby 这段代码里的实例到底是个神马玩意

youknow · 2012年06月01日 · 最后由 jonny 回复于 2012年06月04日 · 2832 次阅读
class Test < Module
end

test = Test.new

test 到底是个神马玩意?

Test 类的实例呀!

还有木有?

是不是没人注意这里面的细节?这个 Test 是继承自 Module 的

#4 楼 @fsword 所有的类不都是继承自 Module 的吗?

class Test < Module
end
test = Test.new

Test.class #=> Class
Test.superclass #=> Module
#But...
String.class  #=> Class
String.superclass #=> Object ??? why not Module?

#5 楼 @fenprace Class 是 Module 的子类,所以一般由用户创建的 class 都是 Class 的实例,也就是 Module 的实例

1.9.3p194 :001 > class A; end
 => nil 
1.9.3p194 :002 > A.is_a? Class
 => true 
1.9.3p194 :003 > A.is_a? Module
 => true 

但如果一个类继承了 Class 或者 Module,那么它理论上应该是 Class/Module 的子类,其实例才是 Class/Module 的实例

1.9.3p194 :001 > class A; end
 => nil 
1.9.3p194 :002 > class X < Module; end
 => nil 
1.9.3p194 :003 > A.new.is_a? Module
 => false 
1.9.3p194 :004 > X.new.is_a? Module
 => true 

这里有个不太好理解的地方,X 本身是继承了 Module,所以是 Module 的子类,但是它又是用 class 关键字创建的,所以它还是 Class 的实例,换句话说,X 和 X.new 都是 Module 的实例

1.9.3p194 :005 > X.is_a? Module
 => true

另外,从语法上,ruby 禁止继承 Class,可是并不反对继承 Class 的父类 Module,这大概也是导致这个问题复杂的原因

这有什么奇怪的。

Module 类也是类。Module 无法实例化,谁规定 Module 类无法实例化?

起码没办法直接实例化:

module A
  def test
  end
end


a = A.new
#module.rb:7:in `<main>': undefined method `new' for A:Module (NoMethodError)
需要 登录 后方可回复, 如果你还没有账号请 注册新账号