2011-06-26 14 views
0

私はFooFactoryクラスを "Singleton"として宣言していますが、そのクラス変数@@ fooは毎回インスタンス化されます。なぜこれはそうですか?Rubyでのシングルトンパターンの実装

主シングルトンクラス:

require 'singleton' 

class FooFactory 
    include Singleton 
    @@foo = nil 

    def get_foo 
    print @@foo.nil?.to_s 
    @@foo ||= "I am a string" 
    return @@foo 
    end 
end 

コントローラコード:

class PagesController < ApplicationController 
    def home 
    @foo = FooFactory.instance.get_foo 
    end 
end 

ビューコード:

<%= @foo %> 

IはFooFactoryprintメソッドが返すべきことを期待falseの後が初めてインスタンス化されました。しかし、pages/homeビューをリフレッシュするたびに、コンソールは印刷を続ける。true

+0

普通のRubyを使って同様のコードを実行しようとしましたか(つまり、不要なものは何も含んでいない) –

答えて

6

開発モードでは、すべての要求に対してクラスが再ロードされ、クラスの状態が失われてしまいます。これはdevelopment.rbにこのラインを探すことにより変更することができます。

config.cache_classes = false 

trueにそれを変えること、それは通常production.rbに設定されていますどのようにしています。 falseに設定する理由は便利です。サーバーを再起動せずにコードを編集し、最新表示を変更して変更を確認することができます。

しかし、Railsでは、状態をクラスに入れて仮想マシンがやり取りされ、スレッドセーフな方法でスレッド状態のVMにアクセスできないため、リクエスト間にステートを入れることは一般的ではありません。これらの問題の回避策がありますが、通常、実行していることを実行するためのより良い方法があります。

+0

ありがとうございました。あなたは最後のパラで言及したものについてもっと詳しく説明するページに私を紹介してください。 – brayne

関連する問題