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