我编写了一些类,其中包含一组配置和操作,每个类都在其自己的名称空间(模块)中。我想在每个命名空间中使用一个正则表达式常量来匹配输入,该输入将确定我将实例化哪个类(数组用于设置优先级)。我想实例化类<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
答案 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