hor*_*guy 9 ruby inheritance singleton module mixins
当在Ruby中继承类时,单例类也会被继承:
class A
def self.hello
puts "hello"
end
end
class B < A
end
B.hello #=> "hello"
Run Code Online (Sandbox Code Playgroud)
但是对于模块,情况并非如此:
module M
def self.goodbye
puts "goodbye"
end
end
class A
include M
end
A.goodbye #=> NameError
Run Code Online (Sandbox Code Playgroud)
为了解决这个限制,许多人都会诉诸这个丑陋的黑客:
module M
def self.included(c)
c.extend ClassMethods
end
module ClassMethods
def goodbye
puts "goodbye"
end
end
end
Run Code Online (Sandbox Code Playgroud)
好的,我的问题是:这个模块限制背后有理论/概念上的原因吗?还是只是一个实施难度?
在查看C源代码(YARV/MRI)之后,我可以确定存在实施难度(不是不可克服的,但是一个完全相同),但这是唯一的原因吗?这种限制还有其他原因吗?
谢谢