Globalne zmienne w Rubim

click fraud protection

Globalne zmienne są zmienne które mogą być dostępne z dowolnego miejsca w programie, niezależnie od zakresu. Są one oznaczone, zaczynając od znaku $ (znak dolara). Jednak użycie zmiennych globalnych jest często uważane za „nie-Rubinowe” i rzadko można je zobaczyć.

Definiowanie zmiennych globalnych

Zmienne globalne są zdefiniowane i używane jak każda inna zmienna. Aby je zdefiniować, po prostu przypisz im wartość i zacznij ich używać. Ale, jak sugeruje ich nazwa, przypisywanie do zmiennych globalnych z dowolnego punktu programu ma globalne implikacje. Poniższy program to pokazuje. Metoda zmodyfikuje zmienną globalną, co wpłynie na sposób druga metoda działa.


$ prędkość = 10. def przyspieszenie. $ prędkość = 100. koniec. def pass_speed_trap. jeśli $ prędkość> 65. # Daj programowi mandat za przekroczenie prędkości. koniec. koniec. przyśpieszyć. pass_speed_trap. 

Niepopularny

Dlaczego więc jest to „nie Rubinowe” i dlaczego nie widzisz często zmiennych globalnych? Mówiąc prościej, łamie enkapsulację. Jeśli jakakolwiek jedna klasa lub metoda może dowolnie modyfikować stan zmiennych globalnych bez żadnej warstwy interfejsu inne klasy lub metody oparte na tej zmiennej globalnej mogą zachowywać się w nieoczekiwany i niepożądany sposób sposób. Ponadto takie interakcje mogą być bardzo trudne do debugowania. Co zmodyfikowało tę zmienną globalną i kiedy? Będziesz przeglądał sporo kodu, aby znaleźć to, co to zrobił, a można tego uniknąć, nie łamiąc zasad enkapsulacji.

instagram viewer

Ale to nie znaczy, że zmienne globalne są nigdy używane w Ruby. Istnieje wiele specjalnych zmiennych globalnych o nazwach jednoznakowych (a-la Perl), z których można korzystać w całym programie. Reprezentują stan samego programu i robią takie rzeczy, jak modyfikowanie rekordów i separatorów pól dla wszystkich dostaje metody

Zmienne globalne

  • $0 - Ta zmienna, oznaczona jako 0 (zero), zawiera nazwę wykonywanego skryptu najwyższego poziomu. Innymi słowy, plik skryptu, który został uruchomiony z wiersz poleceń, a nie plik skryptu zawierający aktualnie wykonywany kod. Więc jeśli skrypt1.rb był uruchamiany z wiersza poleceń, będzie się trzymał skrypt1.rb. Jeśli ten skrypt wymaga script2.rb, $ 0 w tym pliku skryptu również byłoby skrypt1.rb. Nazwa $ 0 odzwierciedla konwencję nazewnictwa używaną w tym samym celu w skryptach powłoki UNIX.
  • $* - Argumenty wiersza poleceń w tablicy oznaczonej $ * (znak dolara i gwiazdka). Na przykład, jeśli miałbyś biec ./script.rb arg1 arg2, wówczas $ * byłoby równoważne z % w {arg1 arg2}. Jest to równoważne ze specjalnym ARGV tablica i ma mniej opisową nazwę, więc jest rzadko używana.
  • $$ - Identyfikator procesu tłumacza, oznaczony $$ (dwa znaki dolara). Znajomość własnego identyfikatora procesu jest często przydatna w programach demonicznych (działających w tle, niepowiązanych z żadnym terminalem) lub usługach systemowych. Jednak staje się to nieco bardziej skomplikowane, gdy w grę wchodzą wątki, więc bądź ostrożny, używając go na ślepo.
  • $ / i $ \ - Są to separatory rekordów wejściowych i wyjściowych. Podczas czytania obiektów za pomocą dostaje i wydrukuj je za pomocą stawia, wykorzystuje je, aby wiedzieć, kiedy został odczytany pełny „rekord” lub co wydrukować między wieloma rekordami. Domyślnie powinny to być znaki nowego wiersza. Ale ponieważ wpływają one na zachowanie wszystkich obiektów we / wy, są one rzadko używane, jeśli w ogóle. Możesz je zobaczyć w mniejszych skryptach, w których łamanie reguł enkapsulacji nie stanowi problemu.
  • $? - Status wyjścia ostatniego wykonanego procesu potomnego. Ze wszystkich wymienionych tutaj zmiennych jest to prawdopodobnie najbardziej przydatna. Powód tego jest prosty: nie można uzyskać statusu zakończenia procesów potomnych na podstawie ich wartości zwracanej z system metoda, tylko prawda lub fałsz. Jeśli musisz znać rzeczywistą wartość zwracaną przez proces potomny, musisz użyć tej specjalnej zmiennej globalnej. Ponownie nazwa tej zmiennej pochodzi z powłok UNIX.
  • $_ - Ostatni napis przeczytany przez dostaje. Ta zmienna może być zamieszaniem dla osób przybywających do Ruby z Perla. W Perlu Zmienna $ _ oznacza coś podobnego, ale zupełnie innego. W Perlu $_ przechowuje wartość ostatniej instrukcji, aw Ruby przechowuje ciąg zwrócony przez poprzednie dostaje wezwanie. Ich użycie jest podobne, ale to, co naprawdę mają, jest zupełnie inne. Często też nie widzisz tej zmiennej (pomyśl o tym, rzadko widzisz którąś z tych zmiennych), ale możesz ją zobaczyć w bardzo krótkich programach Ruby przetwarzających tekst.

Krótko mówiąc, rzadko zobaczysz zmienne globalne. Często mają one złą formę (i „nie-Ruby”) i są bardzo przydatne w bardzo małych skryptach, w których można w pełni docenić pełną implikację ich użycia. Istnieje kilka specjalnych zmiennych globalnych, których można użyć, ale w większości nie są one używane. Tak naprawdę nie musisz wiedzieć aż tyle o zmiennych globalnych, aby zrozumieć większość programów Rubiego, ale powinieneś przynajmniej wiedzieć, że one tam są.

instagram story viewer