Насколько я понимаю твой вопрос, вот что ты ищешь:
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
? И что означает логический аргумент метода?
(Обратите внимание, что логические аргументы всегда плохой дизайн: метод должен делать ровно одну вещь. Если он принимает логический аргумент, он по определению две вещи, один, если Аргумент true, другой аргумент false. Или, если он делает только одну вещь, то это может означать только то, что он игнорирует свой аргумент, и в этом случае он не должен принимать его с самого начала.)