我通过以下脚本创建了一个非常简单的Web服务器:
require 'sinatra'
class MyApp < Sinatra::Base
def initialize(app = nil)
super(app)
puts "******** constructing myapp **********"
end
get '/' do
return "object id: #{object_id}, class #{self.class}"
end
end
MyApp.run!
如果我运行这个小Web服务器,然后第一次调用wget -q -O - http://localhost:4567
,我在运行服务器的控制台中看到:
******** constructing myapp **********
127.0.0.1 - - [28/Jan/2017:16:47:39 EST] "GET / HTTP/1.1" 200 31
- -> /
wget打印:
object id: 10454240, class MyApp
正如预期的那样,在第一次调用时,创建了一个MyApp对象,并调用了initialize
。
然后,如果我对wget -q -O - http://localhost:4567
进行第二次调用,我会看到:
127.0.0.1 - - [28/Jan/2017:16:49:11 EST] "GET / HTTP/1.1" 200 31
- -> /
wget的输出输出如下:
object id: 9387860, class MyApp
因此,在第二次调用时,我有一个不同的MyApp示例(因为object_id的值与第一次调用时不同)但没有调用initialize
。如何创建一个新对象并绕过对initialize
的调用?
1条答案
按热度按时间62lalag41#
每个请求都会创建一个新的类。示例不是用
Sinatra::Application.new
,而是用Sinatra::Application.prototype.dup
,这就是为什么initialize
不是每次都被调用。代码见文档链接。