Подтвердить что ты не робот

Как вы включаете в себя модули в классе Ruby?

Как бы вы описали модули, которые были включены в определенный класс в иерархии классов в 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]
4b9b3361

Ответ 1

Насколько я понимаю ваш вопрос, что-то вроде этого - то, что вы ищете:

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? А что означает логический аргумент метода?

(Обратите внимание, что логические аргументы всегда являются плохим дизайном: метод должен делать только одно: если он принимает логический аргумент, он по определению имеет две вещи: одну, если аргумент истинен, другой - аргумент false., если он делает только одно, то это может означать только то, что он игнорирует свой аргумент, и в этом случае он не должен начинать с него.)