Ваш код работает в этой ситуации (для меня):
class C; include InheritanceEnumerator; end
C.subclasses #=> []
class C1 < C; end
class C2 < C; end
C.subclasses #=> [C1, C2]
, но не работает в следующей ситуации:
class C11 < C1; end
C1.subclasses => NoMethodError: undefined method `<<' for nil:NilClass
Это потому, что вы инициализируете @subclasses
только когдамодуль включен;но вы забываете, что подклассы C
также имеют доступ к методам модулей, но явно не include
it.
Это можно исправить, выполнив следующее:
def self.subclasses
@subclasses ||= []
@subclasses
end
def self.inherited(subclass)
@original_inherited_method.call(subclass) if @original_inherited_method
@subclasses ||= []
@subclasses << subclass
end
РЕДАКТИРОВАТЬ:
Хорошо, в будущем, пожалуйста, укажите, в чем ваша проблема, и предоставьте тестовый код, который вы используете;так как это было упражнение в разочаровании.
Следующее прекрасно работает с вашим кодом:
class C
def self.inherited(s)
puts "inherited by #{s}!"
end
include InheritanceEnumerator
end
class D < C; end #=> "inherited by D!"
C.subclasses #=> [D]
Возможно, причина, по которой он не работает для вас, состоит в том, что вы включили InheritanceEnumerator
до вы определили метод inherited
?