Ruby: динамическое определение классов на основе пользовательского ввода - PullRequest
0 голосов
/ 26 февраля 2011

Я создаю библиотеку в Ruby, которая позволяет пользователю получать доступ к внешнему API.К этому API можно получить доступ через SOAP или REST API.Я хотел бы поддержать оба.

Я начал с определения необходимых объектов в разных модулях.Например:

soap_connecton = Library::Soap::Connection.new(username, password)
response = soap_connection.create Library::Soap::LibraryObject.new(type, data, etc)
puts response.class # Library::Soap::Response

rest_connecton = Library::Rest::Connection.new(username, password)
response = rest_connection.create Library::Rest::LibraryObject.new(type, data, etc)
puts response.class # Library::Rest::Response

Я хотел бы разрешить пользователю указывать, что он хочет использовать только один из API, возможно, что-то вроде этого:

Library::Modes.set_mode(Library::Modes::Rest)
rest_connection = Library::Connection.new(username, password)
response = rest_connection.create Library::LibraryObject.new(type, data, etc)
puts response.class # Library::Response

ОднакоЯ еще не нашел способ динамической установки, например, Library::Connection на основе ввода в Library::Modes.set_mode.Как лучше всего реализовать эту функцию?

1 Ответ

0 голосов
/ 26 февраля 2011

закон Мерфи превалирует;найдите ответ сразу после публикации вопроса в Stack Overflow.

Этот код, похоже, сработал для меня:

module Library
  class Modes
    Rest = 1
    Soap = 2

    def self.set_mode(mode)
      case mode
      when Rest
        Library.const_set "Connection", Class.new(Library::Rest::Connection)
        Library.const_set "LibraryObject", Class.new(Library::Rest::LibraryObject)
      when Soap
        Library.const_set "Connection", Class.new(Library::Soap::Connection)
        Library.const_set "LibraryObject", Class.new(Library::Soap::LibraryObject)
      else
        throw "#{mode.to_s} is not a valid Library::Mode"
      end
    end
  end
end

Быстрый тест:

Library::Modes.set_mode(Library::Modes::Rest)
puts Library::Connection.class == Library::Rest::Connection.class # true
c = Library::Connection.new(username, password)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...