Когда классы наследуются в Рубине одноэлементных классов также наследуются:Почему включение модуля 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), я могу определить, что существует сложность реализации (не непреодолимая, но одна все-таки), но является ли это единственной причиной? Существуют ли другие причины этого ограничения?
спасибо
Почему они должны? Включение модуля - это не то же самое, что наследование класса. –
@Mladen, я не покупаю это. Если концептуальное различие было настолько ясным, то почему люди (даже очень топ-программисты на Ruby) пытаются обойти это ограничение, используя «ClassMethods' hack? Далее - почему это так кажется, что каким-то образом характер модуля подразумевает * это * особое ограничение. – horseyguy
IMHO, модуль mixins! = Множественное наследование, так что, что бы ни делали некоторые люди, на самом деле ничего не доказывает. BTW, можете ли вы проиллюстрировать необходимость взлома на примере реального мира, где, например, не удалось достичь такого же результата, включив модуль 'A' и расширяя модуль' B'? –