2013-07-11 21 views
6

Gdybym użyć metody jakśmieci zbiór zmiennych instancji klasy w Ruby

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

Teraz @service_client zmienna jest instancją klasy. Jak długo to trwa w pamięci? Czy mogę go zainwestować, aby nie był ponownie inicjowany, o ile klasa znajduje się w pamięci (np. Jako zmienna statyczna)?

+5

Jak to off-topic ?! Myślę, że jest to całkowicie poprawne pytanie o programowanie w języku Ruby. –

+0

Uzgodnione. Ponownie otwarte, i życzę, aby ludzie, którzy je zamknęli, wyjaśnili dlaczego. To jest w pełni uzasadnione pytanie. –

Odpowiedz

10

Klasy są również instancjami w Ruby, ale gdy zdefiniujesz klasę w zwykły sposób, zostanie ona przypisana do stałej, a ta stała odwołuje się do innych stałych, uniemożliwiając jej zbieranie. Klasa będzie w pamięci w nieskończoność. Ponieważ klasa pozostanie w pamięci, zmienna instancji klasy również będzie, ponieważ klasa (która jest instancją obiektu) zachowuje odwołanie do swoich zmiennych instancji.

Jako bok, idiomatyczne sposobem, aby to zrobić, to:

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

O twoim "na bok": Co zrobić, jeśli kod inicjujący jest więcej niż jednym wyrażeniem? Utwórz dedykowaną metodę? –

+2

Zwykle albo refactor do metody inicjalizacji, albo można użyć '@service_client || = zacząć ... koniec'. Wynik bloku 'begin..end' zostanie zwrócony jako wartość wyrażenia. –

+0

Dziękuję, Chris. –

Powiązane problemy