2013-07-11 10 views
6

Wenn ich eine Methode, wieGarbage Collection der Klasse Instanzvariablen in Ruby

def self.get_service_client 
    return @service_client if [email protected]_client.nil? 
    @service_client = #initialize logic 
end 

Jetzt @service_client eine Instanzvariable einer Klasse ist. Wie lange ist es in Erinnerung? Kann ich darauf bauen, dass es nicht neu initialisiert wird, solange sich die Klasse im Speicher befindet (d. H. Wie eine statische Variable)?

+5

Wie ist das Wegthema ?! Ich denke, es ist eine absolut gültige Frage über Ruby-Programmierung. –

+0

Einverstanden. Wieder geöffnet, und ich bitte freundlich, dass die Leute, die es geschlossen haben, erklären warum. Das ist eine völlig legitime Frage. –

Antwort

10

Klassen sind auch Instanzen in Ruby, aber wenn Sie eine Klasse auf die übliche Weise definieren, wird sie einer Konstanten zugewiesen, und diese Konstante wird von anderen Konstanten referenziert und verhindert deren Sammlung. So wird die Klasse für immer gespeichert. Da die Klasse im Speicher verbleibt, wird auch die Klasseninstanzvariable verwendet, da die Klasse (die eine Objektinstanz ist) einen Verweis auf ihre Instanzvariablen beibehält.

Als Nebenwirkung, die idiomatische Weg, dies zu tun ist:

def self.get_service_client 
    @service_client ||= initialize_service_client 
end 
+0

Über Ihre "beiseite": Was tun Sie, wenn der Initialisierungscode mehr als nur einen Ausdruck ist? Erstellen Sie eine dedizierte Methode? –

+2

Normalerweise referenziere ich entweder in eine Initialisierungsmethode oder benutze '@service_client || = begin ... end'. Das Ergebnis des Blocks "begin..end" wird als Wert des Ausdrucks zurückgegeben. –

+0

Danke, Chris. –