Zmienne globalne w Ruby

ręka wyciągnięta z komputera, by złapać rubin

erhui1979 / Getty Images





Zmienne globalne to zmienne do których można uzyskać dostęp z dowolnego miejsca w programie, niezależnie od zakresu. Są one oznaczone znakiem $ (znak dolara). Jednak użycie zmiennych globalnych jest często uważane za „nie-Ruby” i rzadko je zobaczysz.

Definiowanie zmiennych globalnych

Zmienne globalne są definiowane 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 zmiennym globalnym z dowolnego punktu programu ma globalne implikacje. Poniższy program pokazuje to. Metoda zmodyfikuje zmienną globalną, co wpłynie na sposób, w jaki druga uruchamia metody.



|_+_|

Niepopularny

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

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



Zmienne globalne

    0 zł- Ta zmienna, oznaczona przez $0 (to jest zero), przechowuje nazwę wykonywanego skryptu najwyższego poziomu. Innymi słowy, plik skryptu, który został uruchomiony z wiersz poleceń , a nie plik skryptu, który zawiera aktualnie wykonywany kod. Więc jeśli skrypt1.rb została uruchomiona z wiersza poleceń, to wytrzyma skrypt1.rb . Jeśli ten skrypt wymaga skrypt2.rb , $0 w tym pliku skryptu również byłoby skrypt1.rb . Nazwa $0 odzwierciedla konwencję nazewnictwa używaną w skryptach powłoki UNIX w tym samym celu. $*- Argumenty wiersza poleceń w tablicy oznaczonej przez $* (znak dolara i gwiazdka). Na przykład, jeśli miałbyś uciekać ./skrypt.rb arg1 arg2 , wtedy $* byłoby równoważne %w{ arg1 arg2 } . Jest to odpowiednik specjalnego ARGV tablica i ma mniej opisową nazwę, więc jest rzadko używana. $$- Identyfikator procesu interpretera, oznaczony przez $$ (dwa znaki dolara). Znajomość własnego identyfikatora procesu jest często przydatna w programach demonów (działających w tle, niepodłączonych do żadnego terminala) lub usługach systemowych. Jednak staje się to nieco bardziej skomplikowane, gdy w grę wchodzą wątki, więc uważaj, aby używać go na ślepo. $/ i $- Są to separatory rekordów wejściowych i wyjściowych. Kiedy czytasz obiekty używając dostaje i wydrukuj je za pomocą stawia , wykorzystuje je, aby wiedzieć, kiedy przeczytano cały „rekord” lub co wydrukować między wieloma rekordami. Domyślnie powinien to być znak nowej linii. Ale ponieważ wpływają one na zachowanie wszystkich obiektów we/wy, są rzadko używane, jeśli w ogóle. Możesz je zobaczyć w mniejszych skryptach, w których złamanie zasad enkapsulacji nie stanowi problemu. $?- Status zakończenia ostatniego wykonanego procesu potomnego. Ze wszystkich wymienionych tutaj zmiennych ta jest prawdopodobnie najbardziej użyteczna. Powód tego jest prosty: nie możesz uzyskać statusu wyjścia 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 systemu UNIX. $_- Ostatni ciąg czytany przez dostaje . Ta zmienna może być powodem do pomyłki dla tych, którzy przychodzą do Rubiego z Perla. W Perlu $_ zmienna oznacza coś podobnego, ale zupełnie innego. W Perlu, $_ przechowuje wartość ostatniej instrukcji, a w Ruby przechowuje ciąg zwrócony przez poprzednią dostaje wezwanie. Ich użycie jest podobne, ale to, co tak naprawdę mają, jest zupełnie inne. Nieczęsto widzisz tę zmienną (jeśli o tym pomyśleć, rzadko widzisz którąkolwiek z tych zmiennych), ale możesz je zobaczyć w bardzo krótkich programach Rubiego przetwarzających tekst.

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