Frage

Ich habe eine benutzerdefinierte Rails Modell geschrieben. Dieses Modell wird von einem tatsächlich Server nicht von einer Datenbanktabelle gesichert (so es nicht erbt nicht von ActiveRecord::Base). Um die erforderlichen Informationen vom Server zu bekommen öffne ich eine SSH-Verbindung zu. Da Schienen Wiederverwendung nicht ein neues Objekt Objekt, sowie eine neue SSH-Verbindung zum Server, wird für immer Anfrage erstellt werden, die empfangen wird. Zur Reduzierung der Server-Stress will ich die SSH-Verbindung schließen, bevor das Modellobjekt Müll gesammelt wird. Ich frage mich, hat Rubin einen Benachrichtigungsmechanismus bereitzustellen, das Objekt zu informieren, dass es zerstört wird? Wenn ja könnte ich diese Benachrichtigung nutzen zu wissen, wann die SSH-Verbindungen zu schließen. Wenn nicht, ich muß es manuell tun, wenn ich weiß, dass ich mit dem Objekt fertig bin.

Wenn ich brauche dies manuell kümmern, kann ich das Objekt explizit zerstören? Oder ist das Beste, was ich tun kann, ist object = nil?

War es hilfreich?

Lösung

Wenn Sie steuern müssen, was passiert, wenn ein Objekt zerstört wird, sollten Sie wirklich explizit es selbst zu zerstören - dies ist konstruktionsbedingt. Sie sind nicht ein Objekt zu zerstören, explizit in der Lage sein soll entweder - das ist auch durch Design

.

Mit anderen Worten, aus der Perspektive des Programms wird ein Objekt nie oder zerstörbare zerstört. Aus diesen Gründen sollten Sie das Problem überdenken (dies ist keine ungewöhnliche Notwendigkeit - Freigabe von Ressourcen, wenn das Objekt nicht mehr benötigt wird), so dass es passt in das Ruby-Paradigma

.

Einstellen des Objekts auf Null gibt einen Hinweis auf den Garbage Collector, aber nicht unbedingt sofort zerstören.

Wenn Sie jedoch die Garbage Collector damit umgehen müssen, dann lesen Sie weiter.

Es gibt keine direkte Unterstützung für eine destructor, aber man kann es eine Finalizerthread Funktion , wenn es zerstört wird.

Nach http://pleac.sourceforge.net/pleac_ruby/classesetc.html it Müll nicht gesammelt werden, wenn es einen Verweis auf das Original-Objekt enthält, so muss ein Klassenmethode und nicht eine Instanzmethode.

sein
class MyClass
    def initialize
        ObjectSpace.define_finalizer(self,
                                     self.class.method(:finalize).to_proc)
    end
    def MyClass.finalize(id)
        puts "Object #{id} dying at #{Time.new}"
    end
end

Andere Tipps

Ich stellte eine Lösung hier auf einem anderen Stackoverflow Threads, Rubin in einer Weise implementiert, die ähnlich ist Python Kontext-Manager. Von der Client-Seite ist die Zerstörung implizit.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top