Globální proměnné v Ruby

Globální proměnné jsou proměnné k nimž lze přistupovat odkudkoli v programu bez ohledu na rozsah. Označují se znakem $ (znak dolaru). Použití globálních proměnných je však často považováno za „un-Ruby“ a jen zřídka je uvidíte.

Definování globálních proměnných

Globální proměnné jsou definovány a použity jako každá jiná proměnná. Chcete-li je definovat, jednoduše jim přiřaďte hodnotu a začněte je používat. Jak ale napovídá jejich název, přiřazení globálním proměnným z jakéhokoli místa v programu má globální důsledky. Následující program to demonstruje. Metoda upraví globální proměnnou, a to ovlivní, jak druhý metoda běží.


$ speed = 10. def urychlit. $ speed = 100. konec. def pass_speed_trap. pokud $ rychlost> 65. # Dejte programu rychlostní lístek. konec. konec. urychlit. pass_speed_trap. 

Nepopulární

Tak proč je tento „un-Ruby“ a proč nevidíte globální proměnné velmi často? Jednoduše řečeno, rozbije se zapouzdření. Pokud kterákoli třída nebo metoda může libovolně měnit stav globálních proměnných bez vrstvy rozhraní jiné třídy nebo metody, které se spoléhají na tuto globální proměnnou, se mohou chovat neočekávaně a nežádoucí způsob. Tyto interakce mohou být navíc velmi obtížně laditelné. Co modifikovalo tuto globální proměnnou a kdy? Prohlédnete si hodně kódu, abyste zjistili, co to udělalo, a tomu by se dalo zabránit tím, že nebudete porušovat pravidla zapouzdření.

instagram viewer

Ale to neznamená, že globální proměnné jsou nikdy používá se v Ruby. Existuje celá řada zvláštních globálních proměnných s jednoznakovými názvy (a-la Perl), které lze použít v celém programu. Představují stav samotného programu a dělají věci, jako je úprava oddělovačů záznamů a polí pro všechny dostane metody.

Globální proměnné

  • $0 - Tato proměnná, označená 0 ​​$ (to je nula), obsahuje jméno prováděného skriptu nejvyšší úrovně. Jinými slovy, soubor skriptu, který byl spuštěn z příkazový řádek, nikoli skriptový soubor, který obsahuje aktuálně provádějící kód. Takže když script1.rb byl spuštěn z příkazového řádku, to by vydrželo script1.rb. Pokud tento skript vyžaduje script2.rb, 0 $ v tomto skriptovém souboru by také bylo script1.rb. Jméno $ 0 odráží konvenci pojmenování používanou ve skriptování prostředí UNIX pro stejný účel.
  • $* - Argumenty příkazového řádku v poli označené znakem $ * (znak dolaru a hvězdička). Například, pokud jste měli běžet ./script.rb arg1 arg2, pak $ * by bylo ekvivalentní % w {arg1 arg2}. To je rovnocenné speciálnímu ARGV pole a má méně popisný název, proto se používá zřídka.
  • $$ - ID procesu tlumočníka označené $$ (dva znaky dolaru). Znalost vlastního ID procesu je často užitečná v démonových programech (které běží na pozadí, nepřipojené od jakéhokoli terminálu) nebo systémových službách. To se však trochu komplikuje, když se jedná o vlákna, takže si dávejte pozor na slepé používání.
  • $ / a $ \ - Toto jsou oddělovače vstupních a výstupních záznamů. Při čtení objektů pomocí dostane a vytisknout je pomocí staví, používá je k tomu, aby věděl, kdy byl přečten úplný „záznam“ nebo co se má tisknout mezi více záznamy. Ve výchozím nastavení by to měl být znak nového řádku. Ale protože tyto ovlivňují chování všech objektů IO, jsou používány jen zřídka, pokud vůbec. Můžete je vidět v menších skriptech, kde porušení pravidel pro zapouzdření není problém.
  • $? - Stav ukončení posledního podřízeného procesu. Ze všech zde uvedených proměnných je to pravděpodobně nejužitečnější. Důvod je jednoduchý: nemůžete získat stav ukončení podřízených procesů podle jejich návratové hodnoty z Systém metoda, pouze true nebo false. Pokud potřebujete znát skutečnou návratovou hodnotu podřízeného procesu, musíte použít tuto speciální globální proměnnou. Název této proměnné je opět převzat z prostředí systému UNIX.
  • $_ - Poslední řetězec přečtený uživatelem dostane. Tato proměnná může být místem zmatku pro ty, kteří přicházejí do Ruby z Perlu. V Perlu, $ _ proměnná znamená něco podobného, ​​ale úplně jiného. V Perlu $_ drží hodnotu posledního příkazu a v Ruby drží řetězec vrácený předchozím dostane vyvolání. Jejich použití je podobné, ale to, co ve skutečnosti drží, je velmi odlišné. Často také tuto proměnnou nevidíte (pomysli na ni, jen zřídka vidíte žádnou z těchto proměnných), ale můžete je vidět ve velmi krátkých programech Ruby, které zpracovávají text.

Stručně řečeno, jen zřídka uvidíte globální proměnné. Jsou často špatnou formou (a „un-Ruby“) a jsou opravdu užitečné pouze ve velmi malých skriptech, kde lze plně ocenit jejich důsledky pro jejich použití. Existuje několik zvláštních globálních proměnných, které lze použít, ale z velké části se nepoužívají. Nemusíte toho tolik vědět o globálních proměnných, abyste porozuměli většině programů Ruby, ale měli byste alespoň vědět, že tam jsou.