W tym artykule będziemy badać następujące tematy:
- zakres metod
- zakres klas
Przed rozpoczęciem
Jestem zachwycony, że mogę podzielić się z Wami naszym najnowszym projektem: Fun Facts about Ruby – Volume 1
Please feel free to spread the word and share this post! 🙏
Dziękuję za poświęcony czas!
W Rubim, zakres programu jest silnie skorelowany z wartością self
.
W tym miejscu wyszczególnimy jakie są wartości self
kiedy jesteśmy w metodzie, klasie i w zakresie najwyższego poziomu.
Zakres metody
W Rubim, zakres najwyższego poziomu jest kontekstem obiektu main
.
W tym momencie self
odnosi się do obiektu main
.
Nie krępuj się przeczytać artykułu Ruby Object Model jeśli nie jesteś zaznajomiony z obiektem
main
.
Teraz, jaki jest kontekst self
wewnątrz metody zdefiniowanej w zakresie najwyższego poziomu?
Tutaj widzimy, że self
również odnosi się do obiektu main
.
Jedyną różnicą jest to, że nie mamy dostępu do zmiennych lokalnych zadeklarowanych w zakresie najwyższego poziomu wewnątrz naszej metody.
Wynika to z faktu, że słowo kluczowe def
osadza zawartość metody w całkowicie izolowanym zakresie.
Jednakże nasza metoda może uzyskać dostęp do zmiennych instancji zadeklarowanych w zakresie najwyższego poziomu.
Ponieważ zmienne instancji są zadeklarowane na poziomie obiektu, możemy uzyskać dostęp do tych zmiennych w innym zakresie, w którym self
odnosi się do tego samego obiektu – obiektu main
w naszym przypadku.
Tak więc, ponieważ self
wskazuje na main
zarówno w zakresie najwyższego poziomu, jak i w metodzie zdefiniowanej w zakresie najwyższego poziomu, możemy uzyskać dostęp do zmiennej instancji @instance_variable
w metodzie hello
.
Zakres klasy
Gdy używamy słowa kluczowego class
:
- zmienia się wartość
self
- zawartość klasy zostaje osadzona w izolowanym zakresie
Przyjrzyjrzyjmy się następującemu przykładowi
Widzimy, że w naszej klasie self
ma inną wartość – odnosi się do klasy Hello
.
Nie mamy również dostępu do zmiennych i metod zdefiniowanych poza klasą.
Zauważmy, że mamy dostęp do zmiennych instancji w metodach instancji z tych samych powodów, które zostały opisane w pierwszej części artykułu.
W części II & III, będziemy bawić się zakresami wykorzystując moduły, klasy zagnieżdżone oraz bloki (FLAT SCOPES).
Voilà !
.