Экземпляр класса в том же пространстве имен, что и регулярное выражение - PullRequest
0 голосов
/ 08 сентября 2018

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

не уверен, что я действительно понял ваш вопрос, но если у вас уже есть объект и у него есть один модуль, как вы описали, вы можете использовать:

your_object.class.parent
0 голосов
/ 08 сентября 2018

Хотя может быть возможно действительно извлечь такую ​​информацию из регулярных выражений, этот подход страдает от микроуправления. Вызывающий код слишком много знает о структуре модулей и должен выполнять слишком много ненужной работы. Добавление только наименьшего бита ООП устраняет проблему.

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!"
0 голосов
/ 08 сентября 2018

Вы можете использовать Module :: nesting .

module MyHelloTest
  class PrintSomeWorld
    Module.nesting
  end
end
  #=> [MyHelloTest::PrintSomeWorld, MyHelloTest]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...