Я написал несколько классов, которые содержат набор конфигураций и действий, и каждый класс находится в своем собственном пространстве имен (модуле). У меня есть константа регулярного выражения в каждом пространстве имен, которую я хочу использовать для сопоставления с входом, который будет определять, какой класс я буду создавать (массив используется для установки порядка приоритетов). Я хочу создать экземпляр класса <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