Globale variabelen zijn variabelen die overal in het programma toegankelijk is, ongeacht de omvang. Ze worden aangegeven door te beginnen met een teken $ (dollarteken). Het gebruik van globale variabelen wordt echter vaak beschouwd als "un-Ruby" en u zult ze zelden zien.
Globale variabelen definiëren
Globale variabelen worden gedefinieerd en gebruikt zoals elke andere variabele. Om ze te definiëren, wijst u er gewoon een waarde aan toe en begint u ze te gebruiken. Maar, zoals hun naam al doet vermoeden, heeft het toewijzen aan globale variabelen vanaf elk punt in het programma wereldwijde implicaties. Het volgende programma laat dit zien. De methode zal een globale variabele wijzigen, en dat zal van invloed zijn op hoe de tweede methode wordt uitgevoerd.
$ snelheid = 10. def versnellen. $ snelheid = 100. einde. def pass_speed_trap. als $ snelheid> 65. # Geef het programma een bekeuring. einde. einde. versnellen. pass_speed_trap.
Impopulair
Dus waarom is dit "un-Ruby" en waarom zie je niet zo vaak globale variabelen? Simpel gezegd, het verbreekt de inkapseling. Als een bepaalde klasse of methode de status van de globale variabelen naar believen kan wijzigen zonder enige interfacelaag andere klassen of methoden die op die globale variabele vertrouwen, kunnen zich onverwacht en ongewenst gedragen manier. Verder kunnen dergelijke interacties erg moeilijk te debuggen zijn. Wat veranderde die globale variabele en wanneer? Je zult behoorlijk wat code doornemen om te vinden wat het heeft gedaan, en dat had kunnen worden voorkomen door de regels voor inkapseling niet te overtreden.
Maar dat wil niet zeggen dat globale variabelen dat zijn nooit gebruikt in Ruby. Er zijn een aantal speciale globale variabelen met namen van één teken (a-la Perl) die tijdens uw hele programma kunnen worden gebruikt. Ze vertegenwoordigen de status van het programma zelf en doen dingen zoals het wijzigen van de record- en veldscheidingstekens voor iedereen krijgt methoden.
Globale variabelen
- $0 - Deze variabele, aangegeven met $ 0 (dat is een nul), bevat de naam van het script op het hoogste niveau dat wordt uitgevoerd. Met andere woorden, het scriptbestand dat is uitgevoerd vanaf de opdrachtregel, niet het scriptbestand dat de momenteel uitgevoerde code bevat. Dus indien script1.rb werd uitgevoerd vanaf de opdrachtregel, het zou houden script1.rb. Als dit script vereist script2.rb, $ 0 in dat scriptbestand zou ook zijn script1.rb. De naam $ 0 weerspiegelt de naamgevingsconventie die in UNIX-shellscripts voor hetzelfde doel wordt gebruikt.
- $* - De opdrachtregelargumenten in een array aangegeven met $ * (dollarteken en asterisk). Bijvoorbeeld als je zou rennen ./script.rb arg1 arg2, dan zou $ * gelijk zijn aan % w {arg1 arg2}. Dit komt overeen met de special ARGV array en heeft een minder beschrijvende naam, dus het wordt zelden gebruikt.
- $$ - De proces-ID van de tolk, aangegeven met $$ (twee dollartekens). Het kennen van de eigen proces-ID is vaak handig in daemon-programma's (die op de achtergrond worden uitgevoerd, los van een terminal) of systeemservices. Dit wordt echter een beetje ingewikkelder als er threads bij betrokken zijn, dus wees voorzichtig met het blindelings gebruiken.
- $ / en $ \ - Dit zijn de invoer- en uitvoerscheidingstekens. Wanneer u objecten leest met krijgt en druk ze af met zetgebruikt het deze om te weten wanneer een compleet "record" is gelezen, of wat er tussen meerdere records moet worden afgedrukt. Dit moet standaard het newline-teken zijn. Maar aangezien deze het gedrag van alle IO-objecten beïnvloeden, worden ze zelden of helemaal niet gebruikt. Mogelijk ziet u ze in kleinere scripts waar het overtreden van de inkapselingsregels geen probleem is.
- $? - De exitstatus van het laatste uitgevoerde kindproces. Van alle hier genoemde variabelen is dit waarschijnlijk het handigst. De reden hiervoor is simpel: u kunt de exitstatus van onderliggende processen niet krijgen door hun retourwaarde van de systeem methode, alleen waar of onwaar. Als u de werkelijke retourwaarde van het onderliggende proces moet kennen, moet u deze speciale globale variabele gebruiken. Nogmaals, de naam van deze variabele is afkomstig van de UNIX-shells.
- $_ - De laatste string gelezen door krijgt. Deze variabele kan een punt van verwarring zijn voor degenen die van Perl naar Ruby komen. In Perl, de $ _ variabele betekent iets soortgelijks, maar totaal anders. In Perl, $_ bevat de waarde van de laatste instructie en in Ruby bevat het de tekenreeks die door de vorige is geretourneerd krijgt aanroeping. Hun gebruik is vergelijkbaar, maar wat ze echt bevatten, is heel anders. Je ziet deze variabele ook niet vaak (denk erover na, je ziet zelden een van deze variabelen), maar je ziet ze misschien in zeer korte Ruby-programma's die tekst verwerken.
Kortom, u ziet zelden globale variabelen. Ze zijn vaak een slechte vorm (en "un-Ruby") en alleen echt nuttig in zeer kleine scripts, waar de volledige implicatie van hun gebruik volledig kan worden gewaardeerd. Er zijn een paar speciale globale variabelen die kunnen worden gebruikt, maar voor het grootste deel worden ze niet gebruikt. Je hoeft niet echt zoveel te weten over globale variabelen om de meeste Ruby-programma's te begrijpen, maar je moet tenminste weten dat ze er zijn.