Poprzednie | Spis treści | Następne |
Zrozumienie zmiennych w języku Ruby | Ruby Number Classes and Conversions |
Jak już poznaliśmy podstawy zmiennych w Rubim, następnym zadaniem jest wyjaśnienie zakresu zmiennych w Rubim.
Co to jest zakres zmiennych?
Zakres określa, gdzie w programie jest dostępna zmienna. Ruby posiada cztery typy zakresu zmiennych: lokalny, globalny, instancja i klasa. Dodatkowo, Ruby posiada jeden typ stały. Każdy typ zmiennej jest deklarowany poprzez użycie specjalnego znaku na początku nazwy zmiennej, jak pokazano w poniższej tabeli.
Nazwa zaczyna się od | Zakres zmiennych |
---|---|
$ |
Zmienna globalna |
@ |
Zmienna instancyjna |
lub _ |
Zmienna lokalna |
|
Stała |
@@ |
Zmienna klasowa |
Dodatkowo, Ruby posiada dwie pseudo-zmienne, którym nie można przypisać wartości. Są to nil, która jest przypisana do niezainicjalizowanych zmiennych oraz self, która odnosi się do aktualnie wykonywanego obiektu. W dalszej części rozdziału zajmiemy się każdym z tych zakresów zmiennych po kolei.
Detecting the Scope of a Ruby Variable
Oczywiście, możesz określić zakres zmiennej patrząc na jej nazwę. Czasami jednak trzeba poznać jej zakres programowo. Użyteczną techniką do poznania zakresu zmiennej jest użycie metody defined?. defined? zwróci zakres zmiennej, do której się odwołujemy, lub nil, jeśli zmienna nie jest zdefiniowana w bieżącym kontekście:
x = 10=> 10defined? x=> "local-variable"$x = 10=> 10defined? $x=> "global-variable"
Zmienne lokalne Ruby
Zmienne lokalne są lokalne dla konstrukcji kodu, w której zostały zadeklarowane. Na przykład, zmienna lokalna zadeklarowana w metodzie lub wewnątrz pętli nie może być dostępna poza tą pętlą lub metodą. Nazwy zmiennych lokalnych muszą zaczynać się od podkreślnika lub małej litery. Na przykład:
loopcounter = 10_LoopCounter = 20
Zmienne globalne w Rubim
Zmienne globalne w Rubim są dostępne z każdego miejsca w programie Rubiego, niezależnie od tego gdzie zostały zadeklarowane. Nazwy zmiennych globalnych są poprzedzone znakiem dolara ($). Na przykład:
$welcome = "Welcome to Ruby Essentials"
Używanie zmiennych globalnych jest stanowczo odradzane. Problem ze zmiennymi globalnymi polega na tym, że nie tylko są one widoczne w dowolnym miejscu w kodzie programu, ale także mogą być zmieniane z dowolnego miejsca w aplikacji. Może to utrudnić śledzenie błędów.
Przydatna jest jednak wiedza, że pewna liczba predefiniowanych zmiennych globalnych jest dostępna dla Ciebie jako programisty Rubiego, aby uzyskać informacje o środowisku Rubiego. Krótkie podsumowanie każdej z tych zmiennych jest zawarte w poniższej tabeli.
Nazwa zmiennej | Wartość zmiennej |
---|---|
|
Lokalizacja ostatniego błędu |
$_ |
Łańcuch ostatnio odczytany przez gets |
$. |
Numer linii ostatnio odczytany przez interpreter |
$& |
Ciąg ostatnio dopasowany przez regexp |
$~ |
Ostatnie dopasowanie regexp, jako tablica podwyrażeń |
$ n |
N-te podwyrażenie w ostatnim dopasowaniu (tak samo jak $~ ) |
$= |
Flaga niewrażliwościflaga niewrażliwości na wielkość liter |
$/ |
Separator rekordów wejściowych |
$\ |
Separator rekordów wyjściowych separator |
|
Nazwa aktualnie wykonywanego pliku skryptu rubinowego |
$* |
Argumenty wiersza poleceń służące do wywołania skryptu. argumenty wiersza poleceń użyte do wywołania skryptu |
$$ |
Identyfikator procesu interpretera Ruby |
$? |
Status zakończenia ostatniego wykonanego procesu potomnego |
Na przykład możemy wykonać metodę gets, aby pobrać dane wejściowe z klawiatury, a następnie odwołać się do zmiennej $_, aby odzyskać wprowadzoną wartość:
irb(main):005:0> getshello=> "hello\n"irb(main):006:0> $_=> "hello\n"
Alternatywnie moglibyśmy znaleźć ID procesu interpretera Ruby:
irb(main):007:0> $$=> 17403
Zmienne klasy Ruby
Zmienna klasy jest zmienną, która jest współdzielona pomiędzy wszystkimi instancjami klasy. Oznacza to, że tylko jedna wartość zmiennej istnieje dla wszystkich obiektów zainicjowanych z tej klasy. Oznacza to, że jeśli jedna instancja obiektu zmieni wartość zmiennej, ta nowa wartość zasadniczo zmieni się dla wszystkich innych instancji obiektu.
Innym sposobem myślenia o zmiennych klasowych jest myślenie o nich jako o zmiennych globalnych w kontekście pojedynczej klasy.
Zmienne klasowe są deklarowane przez poprzedzenie nazwy zmiennej dwoma znakami @ (@@). Zmienne klasowe muszą być zainicjalizowane w czasie tworzenia. Na przykład:
@@total = 0
Zmienne instancji Ruby
Zmienne instancji są podobne do zmiennych klasy z tym wyjątkiem, że ich wartości są lokalne dla konkretnych instancji obiektu. Na przykład, jeśli klasa zawiera zmienną instancji o nazwie @total, jeśli jedna instancja obiektu zmieni bieżącą wartość @total, zmiana jest lokalna tylko dla obiektu, który dokonał zmiany. Inne obiekty tej samej klasy mają swoje lokalne kopie zmiennej, które są niezależne od zmian dokonanych w innych obiektach.
Zmienne instancji są deklarowane w Rubim poprzez poprzedzenie nazwy zmiennej pojedynczym znakiem @:
@total = 10
Zakres stałych Rubiego
Stałe Rubiego są wartościami, które po przypisaniu im wartości nie powinny być zmieniane. Mówię powinny, ponieważ Ruby różni się od większości języków programowania tym, że pozwala na zmianę wartości stałej po jej zadeklarowaniu, chociaż interpreter będzie lekko protestował z komunikatem ostrzegawczym.
Stałe zadeklarowane wewnątrz klasy lub modułu są dostępne wszędzie w kontekście tej klasy lub modułu. Stałe zadeklarowane poza klasą lub modułem mają zasięg globalny.
Previous | Table of Contents | Next |
Zrozumienie zmiennych Ruby | Klasy liczbowe i konwersje w Ruby |
.