当在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)之后,我可以确定存在实施难度(不是不可克服的,但一个都是相同的),但这是唯一的原因吗?这种限制还有其他原因吗?
感谢
答案 0 :(得分:1)
除非有人能提出令人信服的论据,否则我认为限制只取决于实施难度。尽管如此,我在过去几天一直在研究这个问题,并且(测试中)有一个名为include_complete
的新版本的套件,可以克服这些困难并允许模块继承像类继承一样工作(引入单例)
在此处查看项目:http://github.com/banister/include_complete
请注意,该项目仍然处于测试阶段,但到目前为止似乎仍然可以正常工作
答案 1 :(得分:0)
警告:以下只是推测。
如果您正在使用类,则需要单例类方法,因为您依赖它们来创建对象(例如MyClass.new
)。如果您正在使用模块,则不需要它们,因为您无法完全从模块创建对象。