Ruby 为每个请求创建新的sinatra对象,但只调用一次初始化

Ruby 为每个请求创建新的sinatra对象,但只调用一次初始化,ruby,sinatra,Ruby,Sinatra,我通过以下脚本创建了一个非常简单的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

我通过以下脚本创建了一个非常简单的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!
和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
的调用?

为每个请求创建一个新类。实例不是使用
Sinatra::Application.new
创建的,而是使用
Sinatra::Application.prototype.dup
创建的,这就是为什么不每次调用
initialize
。看见
对于代码。

也许它不是每次都像你想象的那样创建一个新实例。在不知道Sinatra的情况下,但可能应用程序实例被克隆或复制了?更准确地说,对于像我这样的ruby初学者:对于每个传入的请求,都通过调用
dup
来创建一个新实例。可以实现
initialize_dup
并在其中添加打印,以查看调用了
dup
object id: 9387860, class MyApp