Как Вы перечисляете включенные Модули в Классе 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]
19
задан Lance Pollard 15 August 2010 в 17:24
поделиться

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

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

19
ответ дан 30 November 2019 в 04:52
поделиться