2010-12-13 14 views
1

Ich lerne Ruby und das ist der Fall, den ich habe.Ruby Singleton von Stdlib. Wie eine Instanz zu töten

require 'singleton' 
class Lab 
    include Singleton 
    def initialize 
    puts 'initializing' 
    end 
end 

l1 = Lab.instance 
l2 = Lab.instance 

Obwohl ich Lab.instance zweimal gemacht habe, bekomme ich die Meldung "Initialisierung" nur einmal. Das bedeutet Singleton funktioniert. Groß!

Rails im Entwicklungsmodus beendet alle Konstanten mit const_remove, so dass bei der nächsten Anforderung Modelle und Controller neu geladen werden.

Ich möchte etwas ähnliches hier versuchen. Ich möchte sowohl l1 als auch l2 töten, so dass wenn ich Lab.instance mache, eine neue Instanz erstellt wird und ich die Nachricht "initialisiere" bekomme.

Gibt es einen Weg, um das zu erreichen, wonach ich frage?

Dank

Antwort

1

Dies ist nur eine Idee, aber wie wäre es Ihr eigenes Singleton-Modul realisiert?

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

class Lab 
    extend MyLittleSingleton 
end 

Es bietet Ihnen nicht die gleiche "Sicherheit" wie der normale Singleton, aber es könnte genau das sein, was Sie brauchen.

+0

Ihre eigenen Sachen rollen immer als letztes Mittel ist. Danke für den Vorschlag und für das Codebeispiel. –

0

Wenn Sie eine brandneue Instanz des Singleton benötigen (zum Beispiel mit ihm während eines Tests zu spielen, ohne weitere Tests zu beeinflussen), können Sie eine anonyme Unterklasse verwenden:

Lab.instance # This writes "initializing" 

MyLab = Class.new(Lab) 

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

Wenn Sie wirklich möchten Ihre Singleton zurücksetzen, können Sie die folgenden Aktionen durchführen, aber sie geben Sie die Warnzone, es ist Teil der öffentlichen API nicht:

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

die Singleton Mix-in verwendet eine ziemlich einfache Mechanismus, den Sie einfach neu implementieren können. Wenn Sie sich den Kern ansehen, werden Sie sehen, dass eine Instanzvariable mit dem Namen @singleton__instance__ zum Caching verwendet wird. Daher sollte das Zurücksetzen dieser Variablen die Aufgabe erfüllen. Wenn Sie also versuchen, diese Klasse Methode Ihrer Klasse hinzuzufügen:

def self.reset 
    @singleton__instance__ = nil 
end 

können Sie tun:

l1 = Lab.instance #=> initializing 
l2 = Lab.instance #=> nothing 
Lab.reset 
l3 = Lab.instance #=> initializing 
l4 = Lab.instance #=> nothing 
Verwandte Themen