Zmienne instancji w zmiennych Ruby
Produkcja H&S / Getty Images
Zmienne instancji zaczynają się od znaku (@) i można się do nich odwoływać tylko w ramach metod klas. Różnią się one od zmiennych lokalnych tym, że nie istnieją w ramach żadnego konkretnego zakres . Zamiast tego dla każdej instancji klasy przechowywana jest podobna tabela zmiennych. Zmienne instancji znajdują się w instancji klasy, więc dopóki ta instancja pozostaje aktywna, zmienne instancji również.
Do zmiennych instancji można się odwoływać w dowolnej metodzie tej klasy. Wszystkie metody klasy używają tej samej instancji zmienna tabela , w przeciwieństwie do zmiennych lokalnych, w których każda metoda będzie miała inną tabelę zmiennych. Możliwy jest jednak dostęp do zmiennych instancji bez ich wcześniejszego definiowania. Nie spowoduje to zgłoszenia wyjątku, ale wartość zmiennej będzie zero i pojawi się ostrzeżenie, jeśli uruchomisz Rubiego z -w przełącznik.
Ten przykład ilustruje użycie zmiennych instancji. Zwróć uwagę, że szulernia zawiera -w przełącznik, który wyświetli ostrzeżenia, jeśli się pojawią. Zwróć także uwagę na nieprawidłowe użycie poza metodą w zakresie klasy. Jest to nieprawidłowe i omówione poniżej.
Dlaczego jest @test zmienna nieprawidłowa? Ma to związek z zakresem i tym, jak Ruby implementuje rzeczy. W ramach metody zakres zmiennej instancji odwołuje się do konkretnego wystąpienia tej klasy. Jednak w zakresie klasy (wewnątrz klasy, ale poza jakimikolwiek metodami) zakresem jest instancja klasy zakres. Ruby implementuje hierarchię klas poprzez tworzenie instancji Klasa obiekty, więc istnieje druga instancja w grze tutaj. Pierwszy instancja jest instancją Klasa klasa, a tu @test ruszymy. Druga instancja to instancja Klasa testowa , a tu @wartość ruszymy. To trochę zagmatwane, ale pamiętaj, aby nigdy nie używać @instancja_zmienne poza metodami. Jeśli potrzebujesz pamięci masowej w całej klasie, użyj @@class_variables , który może być używany w dowolnym miejscu w zakresie klasy (wewnątrz lub poza metodami) i będzie się zachowywał tak samo.
Akcesoria
Zwykle nie można uzyskać dostępu do zmiennych instancji spoza obiektu. Na przykład w powyższym przykładzie nie możesz po prostu zadzwonić t.wartość lub t.@wartość aby uzyskać dostęp do zmiennej instancji @wartość . To złamałoby zasady kapsułkowanie . Dotyczy to również instancji klas podrzędnych, nie mogą one uzyskać dostępu do zmiennych instancji należących do klasy nadrzędnej, nawet jeśli są technicznie tego samego typu. Tak więc, aby zapewnić dostęp do zmiennych instancji, akcesor metody muszą być zadeklarowane.
Poniższy przykład pokazuje, jak można pisać metody akcesora. Pamiętaj jednak, że Rubin udostępnia skrót i że ten przykład istnieje tylko po to, aby pokazać, jak działają metody akcesora. Ogólnie rzecz biorąc, nie jest powszechne spotykanie metod akcesorów napisanych w ten sposób, chyba że potrzebna jest jakaś dodatkowa logika dla akcesora.
Skróty czynią sprawę nieco łatwiejszą i bardziej zwartą. Istnieją trzy z tych metod pomocniczych. Muszą być uruchamiane w zakresie klasy (wewnątrz klasy, ale poza jakimikolwiek metodami) i będą dynamicznie definiować metody, podobnie jak metody zdefiniowane w powyższym przykładzie. Nie dzieje się tu żadna magia i wyglądają one jak słowa kluczowe języka, ale tak naprawdę są tylko dynamicznie definiującymi metodami. Ponadto te akcesory zazwyczaj znajdują się na szczycie klasy. Daje to czytelnikowi natychmiastowy przegląd, które zmienne składowe będą dostępne poza klasą lub dla klas podrzędnych.
Istnieją trzy z tych metod akcesorów. Każdy z nich przyjmuje listę symboli opisujących zmienne instancji, do których mają być dostępne.
Kiedy używać zmiennych instancji
Skoro już wiesz, czym są zmienne instancji, kiedy ich używasz? Zmienne instancji powinny być używane, gdy reprezentują stan obiektu. Nazwisko i wiek ucznia, jego stopnie itp. Nie powinny być używane do tymczasowego przechowywania, do tego służą zmienne lokalne. Jednak mogą być używane do tymczasowego przechowywania między wywołaniami metod dla obliczeń wieloetapowych. Jeśli jednak to robisz, możesz chcieć ponownie przemyśleć kompozycję metody i zamiast tego przekształcić te zmienne w parametry metody.