Ruby 实例与正则表达式位于同一命名空间中的类

Ruby 实例与正则表达式位于同一命名空间中的类,ruby,Ruby,我已经编写了一些包含一组配置和操作的类,每个类都在它自己的名称空间(模块)中。我在每个名称空间中都有一个regex常量,我想用它来匹配一个输入,该输入将决定我将引用哪个类(数组用于设置优先级顺序)。我想实例化类::PrintSomeWorld,但似乎无法直接获得匹配正则表达式的名称空间 问题:是否有获取对象名称空间的命令?下面的代码显示了我当前的解决方案,其中我将模块名作为my_REGEX数据对象的一部分传递。但是,只知道匹配对象的名称空间会更干净 module MyHelloTest MY

我已经编写了一些包含一组配置和操作的类,每个类都在它自己的名称空间(模块)中。我在每个名称空间中都有一个regex常量,我想用它来匹配一个输入,该输入将决定我将引用哪个类(数组用于设置优先级顺序)。我想实例化类
::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
你可以用

你可以用


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

your_object.class.parent

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

your_object.class.parent

虽然确实可以从正则表达式中提取此类信息,但这种方法受到微观管理的影响。调用代码对模块的结构了解得太多,必须做太多不必要的工作。只要添加一点点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!"

虽然确实可以从正则表达式中提取此类信息,但这种方法受到微观管理的影响。调用代码对模块的结构了解得太多,必须做太多不必要的工作。只要添加一点点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!"

当对象为regex类型时,这对我不起作用。当对象为regex类型时,这对我不起作用。啊!我忘了我可以把模块当作对象。。。这会把事情弄清楚的。非常感谢。啊!我忘了我可以把模块当作对象。。。这会把事情弄清楚的。非常感谢。