Когда классы наследуются в 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), я могу определить, есть ли сложности в реализации (не непреодолимые, но все же одинаковые), но единственная ли это причина? Есть ли другие причины для такого ограничения?
спасибо