ruby - 将当前类属性注入(inject)新类的构造函数

标签 ruby class

我正在尝试创建一个类来初始化一个 WEBrick 服务器,该服务器包含一个 WEBrick servlet,如果没有给出请求路径,它会返回一些默认的 HTML 字符串。

主要问题是我会将当前类的实例变量注入(inject)到新类的构造函数中,这是我真的不知道该怎么做的事情。

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

我希望这是可能的。我已经尝试过使用全局变量,它们确实可以正常工作,但它并不十分理想。

最佳答案

看起来 WEBrick::HTTPServlet::AbstractServlet 已经为此提供了一个合适的接口(interface)(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

这将允许您避免您正在创建的所有匿名类定义,并为您提供更清晰的自定义类实现。如果您想维护当前拥有的封装,可以在 MyServer 中命名空间 DefaultGetHandler

关于ruby - 将当前类属性注入(inject)新类的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50715938/

相关文章:

ruby - pry 开显示像 [äöüßÄÖÜß](utf-8 编码)这样的字符? (可能是特定于 Windows 的问题?)

python - “队列”对象没有属性 'size'

ruby-on-rails - 在 Aptana/Eclipse 中调试 Rails 应用程序

类似页面部分的 Ruby PageObject 设计

python - 保存堆栈?

c++ - 在 vector 中存储各种类型

php - Prestashop Collection 加入数据库

html - 在 rails 上安装 bootstrap 3 后的文本域高度问题

c++ - 静态成员的声明和初始化

python - 如何在构造函数类内部调用内部函数?