Question

J'ai écrit un modèle Rails personnalisé. Ce modèle est supporté par un serveur et non par une table de base de données (il n'hérite donc pas de ActiveRecord :: Base ). Afin d’obtenir les informations demandées du serveur, j’ouvre une connexion SSH avec celui-ci. Parce que rails ne réutilise pas d'objet, un nouvel objet, ainsi qu'une nouvelle connexion SSH au serveur, sera créé pour toute demande reçue. Pour réduire le stress du serveur, je souhaite fermer la connexion SSH avant que l'objet de modèle ne soit récupéré. Je me demande si Ruby fournit un mécanisme de notification pour informer l'objet qu'il sera détruit. Si tel est le cas, je pourrais utiliser cette notification pour savoir quand fermer les connexions SSH. Sinon, je devrai le faire manuellement quand je saurai que j'ai fini avec l'objet.

Si j'ai besoin de m'en occuper manuellement, puis-je détruire explicitement l'objet? Ou est-ce que le mieux que je puisse faire est object = nil ?

Était-ce utile?

La solution

Si vous devez contrôler ce qui se passe lorsqu'un objet est détruit, vous devez le détruire explicitement vous-même - ceci est voulu par la conception même. Vous n'êtes pas censé être capable de détruire un objet de manière explicite non plus - cela est également intentionnel.

En d’autres termes, du point de vue de votre programme, un objet n’est jamais détruit ni détruit. Pour ces raisons, vous devriez repenser le problème (il ne s’agit pas d’un besoin inhabituel: libérer des ressources lorsque l’objet n’est plus utilisé), de sorte qu’il entre dans le paradigme Ruby.

Définir l'objet sur nil donne un indice au ramasse-miettes, mais ne le détruit pas nécessairement immédiatement.

Toutefois, si le ramasse-miettes doit le gérer, poursuivez votre lecture.

Il n'y a pas de support direct pour un destructeur, mais vous pouvez le faire appeler fonction de finaliseur lorsqu’elle est détruite.

Selon http://pleac.sourceforge.net/pleac_ruby/classesetc.html/a > il ne peut pas être nettoyé s'il contient une référence à l'objet d'origine, il doit donc s'agir d'une méthode de classe et non d'une méthode d'instance.

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

Autres conseils

J'ai posté une solution ici sur un autre thread StackOverflow qui implémente Ruby de manière similaire. au gestionnaire de contexte de Python. Du côté client, la destruction est implicite.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top