我正在尝试创建一个类来初始化一个 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/