Как Вы перечислили бы модули, которые были включены в определенный класс в иерархии классов в Ruby? Что-то вроде этого:
module SomeModule
end
class ParentModel < Object
include SomeModule
end
class ChildModel < ParentModel
end
p ChildModel.included_modules #=> [SomeModule]
p ChildModel.included_modules(false) #=> []
Список предков заставляет модуль казаться выше в дереве:
p ChildModel.ancestors #=> [ChildModel, ParentModel, SomeModule, Object, Kernel]
Насколько я понимаю ваш вопрос, вы ищете что-то вроде этого:
class Class
def mixin_ancestors(include_ancestors=true)
ancestors.take_while {|a| include_ancestors || a != superclass }.
select {|ancestor| ancestor.instance_of?(Module) }
end
end
Однако я не совсем понимаю ваши тестовые примеры: почему SomeModule
указан как включенный модуль ChildModel
, хотя он не фактически включен в ChildModel
, а в ParentModel
? И, наоборот, почему Kernel
не указан как включенный модуль, хотя он столько же в цепочке предков, сколько SomeModule
? И что означает логический аргумент метода?
(Обратите внимание, что логические аргументы всегда плохой дизайн: метод должен делать только одно действие. Если он принимает логический аргумент, он делает по определению две вещи: одна, если аргумент истинен, другая, если аргумент ложен. Или, если он делает только одно, то это может означать только то, что он игнорирует свой аргумент, и в этом случае он не должен принимать это для начала.)