代码之家  ›  专栏  ›  技术社区  ›  Sancarn

将当前类属性注入新类的构造函数

  •  1
  • Sancarn  · 技术社区  · 6 年前

    我试图创建一个类来初始化一个webrick服务器,该服务器包含一个webrick servlet,如果没有给定请求路径,它将返回一些默认的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 回复  |  直到 6 年前
        1
  •  1
  •   Kimmo Lehto    6 年前

    音符 :@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
    
        2
  •  2
  •   engineersmnky    6 年前

    它出现了 WEBrick::HTTPServlet::AbstractServlet 已经为此提供了适当的接口( Documentation 例如)

     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 如果您想维护当前的封装