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



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

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

似乎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

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

注意:@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

相关内容

最新更新