ruby 新的sinatra对象,用于每个请求,但只调用一次初始化

nwnhqdif  于 2023-10-17  发布在  Ruby
关注(0)|答案(1)|浏览(106)

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

62lalag4

62lalag41#

每个请求都会创建一个新的类。示例不是用Sinatra::Application.new,而是用Sinatra::Application.prototype.dup,这就是为什么initialize不是每次都被调用。代码见文档链接。

相关问题