在与正则表达式相同的名称空间中实例化一个类

时间:2018-09-07 22:15:10

标签: ruby

我编写了一些类,其中包含一组配置和操作,每个类都在其自己的名称空间(模块)中。我想在每个命名空间中使用一个正则表达式常量来匹配输入,该输入将确定我将实例化哪个类(数组用于设置优先级)。我想实例化类<namespace>::PrintSomeWorld,但似乎无法直接获取匹配的正则表达式的名称空间。

问题:是否存在用于获取对象名称空间的命令?下面的代码显示了我当前的解决方案,其中我将模块名称作为MY_REGEX数据对象的一部分进行传递。但是,只知道匹配对象的名称空间会更干净。

module MyHelloTest
  MY_REGEX = {mname: name, mregex: /test/}
  class PrintSomeWorld
    def initialize
      p "hello world!"
    end
  end
end

module MyGoodbyeTest
  MY_REGEX = {mname: name, mregex: /goodbye/}
  class PrintSomeWorld
    def initialize
      p "goodbye world!"
    end
  end
end

mytests = [MyHelloTest::MY_REGEX, MyGoodbyeTest::MY_REGEX]
found_regex = mytests.find {|f| f[:mregex].match("this is a goodbye")}
Object.const_get(found_regex[:mname])::PrintSomeWorld.new

3 个答案:

答案 0 :(得分:2)

尽管确实有可能从正则表达式中提取此类信息,但这种方法受到微观管理的困扰。调用代码对模块的结构了解太多,因此必须做很多不必要的工作。仅添加OOP的最小位就可以解决问题。

module MyHelloTest
  MY_REGEX = /test/

  def self.match(str)
    MY_REGEX.match(str)
  end

  def self.print
    PrintSomeWorld.new
  end

  class PrintSomeWorld
    def initialize
      p "hello world!"
    end
  end
end

module MyGoodbyeTest
  MY_REGEX = /goodbye/

  def self.match(str)
    MY_REGEX.match(str)
  end

  def self.print
    PrintSomeWorld.new
  end

  class PrintSomeWorld
    def initialize
      p "goodbye world!"
    end
  end
end

mytests = [MyHelloTest, MyGoodbyeTest]
found_module = mytests.find {|f| f.match("this is a goodbye")}
found_module.print
# >> "goodbye world!"

答案 1 :(得分:0)

您可以使用Module::nesting

module MyHelloTest
  class PrintSomeWorld
    Module.nesting
  end
end
  #=> [MyHelloTest::PrintSomeWorld, MyHelloTest]

答案 2 :(得分:0)

不确定我是否真的理解您的问题,但是如果您已经有了该对象并且它具有一个模块(如您所述),则可以使用:

your_object.class.parent