Вставить текущее свойство класса в конструктор нового класса - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь создать класс, который инициализирует сервер WEBrick, который содержит сервлет WEBrick, который возвращает некоторую строку HTML по умолчанию, если путь запроса не указан.

Основная проблема заключается в том, что я бы вставил переменную экземпляра текущего класса в конструктор нового класса, и я не знаю, как это сделать.

class MyServer
  def initialize(defaultHTML)
    @defaultHtml = defaultHTML
    @server = WEBrick::HTTPServer.new(
      :Port => 12357,
      :DocumentRoot = Dir.pwd
    )
    defaultGetHandler = Class.new(WEBrick::HTTPServlet::AbstractServlet) do
      def do_GET(request,response)
        if request.path.to_s == "/"
          response.body = #SOMEHOW get @defaultHTML here...?
        end
      end
    end
    @server.mount "/", defaultGetHandler
  end
end

Я ожидаю, что это возможно.Я уже пытался использовать глобальные переменные, и они работают нормально, но это не совсем идеально.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Похоже, WEBrick::HTTPServlet::AbstractServlet уже предлагает соответствующий интерфейс для этого ( Документация ), например,

 class DefaultGetHandler < WEBrick::HTTPServlet::AbstractServlet
   def initialize(server,default_html)
     super(server)
     @default_html = default_html
   end 
   def do_GET(request,response)
     if request.path.to_s == "/"
      response.body = @default_html
     end
   end
 end

Тогда MyServer становится

class MyServer
  def initialize(default_html)
    @server = WEBrick::HTTPServer.new(
      :Port => 12357,
      :DocumentRoot = Dir.pwd
    )

    @server.mount "/", DefaultGetHandler, default_html
  end
end

Это будетпозволит вам избежать всех анонимных определений классов, которые вы создаете прямо сейчас, и обеспечит вам более чистую реализацию вашего пользовательского класса.Вы можете назвать пространство DefaultGetHandler внутри MyServer, если хотите сохранить инкапсуляцию, которая у вас есть

0 голосов
/ 06 июня 2018

Примечание : ответ @engineersmnky гораздо лучше для вашего конкретного случая использования.Этот ответ может представлять интерес для тех, кто ищет решение для аналогичной, но не связанной с WEBrick::HTTPServlet::AbstractServlet проблемы.

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

class MyServer
  def initialize(defaultHTML)
    @defaultHtml = defaultHTML
    @server = WEBrick::HTTPServer.new(
      :Port => 12357,
      :DocumentRoot = Dir.pwd
    )
    defaultGetHandler = Class.new(WEBrick::HTTPServlet::AbstractServlet) do
      class << self
        attr_accessor :defaultHtml  # class level attr_accessor
      end

      def do_GET(request,response)
        if request.path.to_s == "/"
          # reference to class level instance variable:
          response.body = self.class.defaultHtml 
        end
      end
    end

    defaultGetHandler.defaultHtml = @defaultHtml

    @server.mount "/", defaultGetHandler
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...