Вы должны проверить, если:
- константа, ссылающаяся на модуль, существует,
- объект, на который ссылается константа, является модулем.
Попробуйте это:
def module_exists?(name, base = self.class)
base.const_defined?(name) && base.const_get(name).instance_of?(::Module)
end
Тогда в вашем коде:
module_exists?(ARGV.first, Required::Module)
Он вернет true
, если в заданной базе пространств имен есть модуль с данным именем. Отличие от примеров, приведенных в других ответах, состоит в том, что он вернет false
, если запрашиваемое имя относится к классу, а не к модулю.
Включить классы в тест
Если вы хотите изменить это поведение и заставить метод также возвращать true
для классов (не только модулей), измените instance_of?
на is_a?
.
ООП способ
Вы также можете кодировать его более объектно-ориентированным способом, если ваш Required::Module
модуль является единственным модулем, который вы тестируете для подмодулей:
module Required::Module
def submodule_exists?(name)
const_defined?(name) && const_get(name).instance_of?(::Module)
end
end
module_function :submodule_exists?
Тогда в вашем коде:
Required::Module.submodule_exists?(ARGV.first)