代码之家  ›  专栏  ›  技术社区  ›  Andrei Serdeliuc ॐ

检查Ruby中是否存在模块

  •  17
  • Andrei Serdeliuc ॐ  · 技术社区  · 14 年前

    例如,我正在根据在cli上传递的参数动态定义模块名。 Required::Module::#{ARGV.first}

    有没有办法检查该模块是否存在?另外,我如何在不知道确切名称的情况下对其运行方法?

    7 回复  |  直到 10 年前
        1
  •  8
  •   Daniel O'Hara    14 年前

    使用检查模块是否存在 const_get 方法:

    begin
        mod = Required::Module::const_get "ModuleName"
        #It exists
    rescue NameError
        #Doesn't exist
    end
    
        2
  •  34
  •   horseyguy    14 年前

    使用 const_defined? 为此。

    Required::Module.const_defined?(:ModuleName)
    

    返回“真”或“假”。

        3
  •  14
  •   Andrew Grimm atk    14 年前
    defined?(Required::Module)
    

    给予 "constant" 如果它存在,并且 nil 如果没有。

    更新 :抱歉,没有正确阅读您的问题。

    defined?(eval("Required::Module::"+string))
    

    应该给你你想要的。

        4
  •  2
  •   siefca    12 年前

    您必须检查是否:

    • 存在一个引用模块的常量,
    • 常量保存引用的对象是一个模块。

    试试看:

     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 如果查询的名称引用到类,而不是模块。

    在测试中包含类

    如果要更改该行为并强制该方法同时返回 对于类(不仅仅是模块)更改 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)
    
        5
  •  2
  •   ybs    11 年前

    如果你有活动支持

    mod = ("Required::Module::#{ARGV.first}".constantize rescue nil)
    
        6
  •  1
  •   starfry    10 年前

    如果你 require 扩展其他内容的内容,您不能将测试建立在常量上,因为扩展可能无法定义新的常量。相反,它基于其他东西的存在,比如新方法。

    我用下面的测试 open_uri_redirections 已被要求:

    if OpenURI.methods.include?(:redirectable_safe?)
      # extension loaded
    else
      # extension not loaded
    fi
    
        7
  •  1
  •   saquino88    10 年前

    当前选定的答案不正确。 const_get const_defined 查找任何常量名,而不管调用该方法的对象是什么。例如,如果我想检查 MyModule::Rails 在Rails应用程序中,使用 康斯坦格 将返回正常的Rails模块。

    要检查特定命名空间中的常量,请使用 constants 方法和检查您的类:

    mymodule.constants.include?(“Rails”)错误