当类在 Ruby 中被继承时,单例类也被继承:
class A
def self.hello
puts "hello"
end
end
class B < A
end
B.hello #=> "hello"
然而对于模块,情况并非如此:
module M
def self.goodbye
puts "goodbye"
end
end
class A
include M
end
A.goodbye #=> NameError
为了解决这个限制,许多人求助于这个丑陋的黑客:
module M
def self.included(c)
c.extend ClassMethods
end
module ClassMethods
def goodbye
puts "goodbye"
end
end
end
好的,所以我的问题是:这种对模块的限制背后是否有理论/概念上的原因?还是只是实施困难?
查看 C 源代码 (YARV/MRI) 后,我可以确定存在一个实现困难(不是无法克服,但都是一样的),但这是唯一的原因吗?这种限制还有其他原因吗?
谢谢