class Test < Module
end
test = Test.new
test 到底是个神马玩意?
#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 A
def test
end
end
a = A.new
#module.rb:7:in `<main>': undefined method `new' for A:Module (NoMethodError)