2017-01-28 8 views
2

私は、次のスクリプトを使用して、非常に単純な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が呼び出されます。

127.0.0.1 - - [28/Jan/2017:16:49:11 EST] "GET/HTTP/1.1" 200 31 
- ->/

そして、これはwgetプリントの出力:2番目の呼び出しで

object id: 9387860, class MyApp 

ので、私が持っている私はwget -q -O - http://localhost:4567への2回目の呼び出しを行う場合

はその後、私はこれを参照してくださいMyAppの別のインスタンス(object_idはフリーリスト呼び出しと同じ値を持たないため)しかしinitializeは呼び出されません。新しいオブジェクトを作成してinitializeへの呼び出しをバイパスすることは可能ですか?

+0

おそらく、それがそうだと思われるごとに新しいインスタンスを作成していないことがあります。 – tadman

+0

Sinatraを知らないうちに、おそらくAppインスタンスが複製されたり、複製されたりしますか? – spickermann

答えて

2

すべてのリクエストに対して新しいクラスが作成されます。このインスタンスはSinatra::Application.newではなく、Sinatra::Application.prototype.dupと表示されるため、initializeは毎回呼び出されません。コードについては、 document link を参照してください。

+0

私のようなルビー初心者の方がより正確です。すべての着信要求に対して、 'dup'を呼び出すことによって新しいインスタンスが作成されます。 'initialize_dup'を実装し、' dup'が呼び出されたことを確認するためにそこにプリントを追加することは可能です。 – mabead

関連する問題