Как вы перечисляете включенные модули в классе Ruby? - PullRequest
18 голосов
/ 15 августа 2010

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

1 Ответ

18 голосов
/ 15 августа 2010

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

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. Или, если он делает только одну вещь, то это может означать только то, что он игнорирует свой аргумент, и в этом случае он не должен принимать его с самого начала.)

...