2010-12-13 21 views
1

私はルビーを学んでおり、これは私の場合です。stdlibのRubyシングルトン。インスタンスを殺す方法

Lab.instanceを2回実行したにもかかわらず、メッセージを「初期化」するのは1回だけです。それはシングルトンが働いていることを意味します。すばらしいです!

Railsはconst_removeを使用してすべての定数を強制終了し、次の要求モデルとコントローラで再ロードされます。

私はここで同様のことを試してみたいです。 Lab.instanceを実行するときに新しいインスタンスが作成され、メッセージが「初期化」されるように、l1とl2の両方を強制終了します。

私が求めていることを達成する方法はありますか?

おかげ

答えて

1

これは単なるアイデアですが、どのようにあなた自身のシングルトンモジュールの実装についてはどうですか?

module MyLittleSingleton 
    def instance(*args, &block) 
    @instance ||= new(*args, &block) 
    end 
    def reload_instance! 
    @instance = nil 
    end 
end 

class Lab 
    extend MyLittleSingleton 
end 

通常のシングルトンと同じ「安全性」は提供されませんが、必要なものだけかもしれません。あなたのシングルトンのブランドの新しいインスタンスが必要な場合

+0

は、最後の手段としてそこに常にあります。提案とコード例をありがとう。 –

0

は、あなたが使用できる匿名のサブクラスを(例えば、他のテストに影響を与えることなく、テスト中にそれを再生する):

Lab.instance # This writes "initializing" 

MyLab = Class.new(Lab) 

MyLab.instance # This writes "initializing" 
MyLab.instance # This writes nothing 

場合本当にあなたのシングルトンをリセットしたい、あなたは次の操作を行うことができますが、あなたは警告ゾーンを入力し、それはパブリックAPIの一部ではありません。

Lab.instance # This writes "initializing" 

# Do it at your own risks 
Singleton.__init__(Lab) 

Lab.instance # This writes "initializing" 
Lab.instance # This writes nothing 
1

シングルトンミックスインはかなり単純なを使用していますメカニズムを簡単に再実装することができます。そのコアを見ると、キャッシュには@singleton__instance__という名前のインスタンス変数が使用されています。したがって、この変数をリセットすると、ジョブが実行されます。このように、あなたのクラスに、このクラスのメソッドを追加しようとした場合:

def self.reset 
    @singleton__instance__ = nil 
end 

あなたが行うことができますあなた自身のものを転がり

l1 = Lab.instance #=> initializing 
l2 = Lab.instance #=> nothing 
Lab.reset 
l3 = Lab.instance #=> initializing 
l4 = Lab.instance #=> nothing 
関連する問題