Ruby/Zmienne globalne

Zmienne globalne

edytuj

Zmienna globalna posiada nazwę zaczynającą się znakiem $. Można się do niej odwołać z dowolnego punktu programu. Przed inicjalizacją zmienna globalna ma specjalną wartość: nil.

irb(main):001:0> $a
=> nil
irb(main):002:0> $a = 5
=> 5
irb(main):003:0> $a
=> 5

Zmienne globalne powinny być używane oszczędnie. Są one niebezpieczne, ponieważ mogą być zapisane z dowolnego miejsca programu. Nadmierne użycie zmiennych globalnych może sprawić, że izolowanie błędów będzie trudne, a ponadto może wskazywać, że projekt programu nie został gruntownie przemyślany. Ilekroć uznasz za niezbędne użycie zmiennej globalnej, upewnij się, że dasz jej opisową nazwę która nie będzie skłaniać do użycia jej potem niezgodnie z twoimi intencjami. Na przykład, nazwanie zmiennej globalnej "$a" będzie prawdopodobnie złym pomysłem.

Jedną z przyjemnych cech zmiennych globalnych jest to, że mogą być śledzone. Możesz określić procedurę, która będzie wywoływana za każdym razem, gdy wartość zmiennej ulegnie zmianie.

irb(main):004:0> trace_var :$a, lambda { puts "$a wynosi teraz #{$a}" }
=> nil
irb(main):005:0> $a = 0
$a wynosi teraz 0
=> 0

Jeśli zmienna globalna została przeznaczona do pracy jako przełącznik wywołujący procedurę, gdy tylko zmieni się jej wartość, nazywamy ją czasem aktywną zmienną. Takie użycie zmiennych może być całkiem użyteczne do np. aktualizacji wyświetlania GUI.

Istnieje zbiór specjalnych zmiennych, który nazwy składają się ze znaku dolara ($) oraz jakiegoś pojedynczego znaku. Dla przykładu, $$. zawiera identyfikator procesu interpretera Rubiego i jest tylko do odczytu. Oto główne zmienne systemowe:

Nazwa Opis
$! informacja o ostatnim błędzie
$@ położenie błędu
$_ ostatni łańcuch przeczytany przez gets
$. numer linii przeczytany ostatnio przez interpreter
$& ostatni łańcuch dopasowany przez wyrażenie regularne
$~ ostatnie dopasowanie do wyrażanie regularnego, jako tablica podwyrażeń
$n n-te podwyrażenie w ostatnim match (to samo co $~[n])
$= flaga niewrażliwości na duże/małe litery
$/ separator danych wejściowych
$\ separator danych wyjściowych
$0 nazwa bieżącego skryptu Rubiego
$* argumenty z linii poleceń
$$ identyfikator procesu interpretera
$? status wyjściowy ostatniego wykonanego procesu potomka

W powyższym $_ i $~ mają zasięg lokalny. Choć ich nazwy sugerują, że powinny być globalne, to z wygody jak i pewnych historycznych zaszłości są używane w ten sposób.

Są jeszcze dwie specjalne zmienne systemowe:

Nazwa Opis
__FILE__ zwraca nazwę bieżącego pliku (nie skryptu, z którego został uruchomiony program)
__LINE__ zwraca numer bieżącej linii