Domanda

Ho scritto un modello Rails personalizzato. Questo modello è supportato da un server in realtà non da una tabella di database (quindi non eredita da ActiveRecord :: Base ). Per ottenere le informazioni richieste dal server apro una connessione SSH ad esso. Poiché le rotaie non riutilizzano l'oggetto, verrà creato un nuovo oggetto, nonché una nuova connessione SSH al server, per ogni richiesta ricevuta. Per ridurre lo stress del server, desidero chiudere la connessione SSH prima che l'oggetto modello venga raccolto. Mi chiedo il rubino fornisce un meccanismo di notifica per informare l'oggetto che verrà distrutto? In tal caso, potrei utilizzare questa notifica per sapere quando chiudere le connessioni SSH. Altrimenti dovrò farlo manualmente quando saprò di aver finito con l'oggetto.

Se devo occuparmene manualmente, posso distruggere esplicitamente l'oggetto? O il meglio che posso fare è object = nil ?

È stato utile?

Soluzione

Se devi controllare cosa succede quando un oggetto viene distrutto, dovresti davvero distruggerlo esplicitamente da solo - questo è di progettazione. Nemmeno tu dovresti essere in grado di distruggere un oggetto in modo esplicito, anche in base alla progettazione.

In altre parole, dal punto di vista del programma, un oggetto non viene mai distrutto o distruttibile. Per questi motivi dovresti ripensare il problema (questo non è un bisogno insolito - rilascio di risorse quando l'oggetto non è più necessario), quindi si adatta al paradigma di Ruby.

L'impostazione di un oggetto su zero fornisce un suggerimento al Garbage Collector, ma non necessariamente lo distrugge immediatamente.

Tuttavia, se è necessario che il Garbage Collector lo gestisca, continua a leggere.

Non esiste un supporto diretto per un distruttore, ma puoi farlo chiamare a funzione finalizzatore quando viene distrutta.

Secondo http://pleac.sourceforge.net/pleac_ruby/classesetc.html potrebbe non essere garbage collection se contiene un riferimento all'oggetto originale, quindi deve essere un metodo di classe e non un metodo di istanza.

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

Altri suggerimenti

Ho pubblicato una soluzione qui su un altro thread StackOverflow che implementa Ruby in modo simile al gestore del contesto di Python. Dal lato client, la distruzione è implicita.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top