Globale variabelen in Ruby

Globale variabelen zijn variabelen die overal in het programma toegankelijk zijn, ongeacht het bereik. Ze worden aangegeven door te beginnen met een $ -teken (dollarteken). Het gebruik van globale variabelen wordt echter vaak als 'on-Ruby' beschouwd 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 eenvoudig een waarde aan toe en begint u ze te gebruiken. Maar, zoals hun naam suggereert, heeft het toewijzen aan globale variabelen vanaf elk punt in het programma globale implicaties. Het volgende programma demonstreert dit. De methode zal een globale variabele wijzigen, en dat heeft invloed op hoe de tweede methode wordt uitgevoerd.

 $ speed = 10 def accelerate $ speed = 100 end def pass_speed_trap if $ speed> 65 # Geef het programma een speeding ticket end end accelerate pass_speed_trap 

onpopulair

Dus waarom is dit "on-Ruby" en waarom zie je niet vaak globale variabelen? Simpel gezegd, het breekt inkapseling. Als een enkele klasse of methode de staat van de globale variabelen naar believen zonder interface-laag kan wijzigen, kunnen andere klassen of methoden die op die globale variabele vertrouwen, zich op een onverwachte en ongewenste manier gedragen. Verder kunnen dergelijke interacties erg moeilijk te debuggen zijn. Wat heeft die globale variabele gewijzigd en wanneer? Je zult heel wat code doornemen om te vinden wat het heeft gedaan, en dat had voorkomen kunnen worden door de regels van 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 in uw programma kunnen worden gebruikt. Ze vertegenwoordigen de status van het programma zelf, en doen dingen zoals de record- en veldscheidingstekens voor iedereen wijzigen 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 werd uitgevoerd vanaf de opdrachtregel, niet het scriptbestand dat de momenteel uitvoerende code bevat. Dus indien script1.rb werd uitgevoerd vanaf de opdrachtregel, het zou vasthouden script1.rb. Als dit script vereist script2.rb, $ 0 in dat scriptbestand zou ook zijn script1.rb. De naam $ 0 weerspiegelt de naamgevingsconventie die wordt gebruikt in UNIX shell scripting voor hetzelfde doel.
  • $ * - De opdrachtregelargumenten in een array aangegeven met $ * (dollarteken en asterisk). Bijvoorbeeld als je zou rennen ./script.rb arg1 arg2, dan zou $ * equivalent zijn aan % w arg1 arg2. Dit is gelijk aan de speciale 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 het gaat om threads, dus wees voorzichtig met het blind gebruiken.
  • $ / en $ \ - Dit zijn de invoer- en uitvoerrecordscheidingstekens. Wanneer u objecten leest met krijgt en druk ze af met puts, het gebruikt deze om te weten wanneer een volledig "record" is gelezen, of wat moet worden afgedrukt tussen meerdere records. Standaard moet dit het teken voor de nieuwe regel zijn. Maar omdat deze het gedrag van alle IO-objecten beïnvloeden, worden ze zelden of helemaal niet gebruikt. Je ziet ze misschien in kleinere scripts waar het overtreden van de inkapselingsregels geen probleem is.
  • $? - De exitstatus van het laatst uitgevoerde onderliggende proces. Van alle hier genoemde variabelen is dit waarschijnlijk het meest nuttig. De reden hiervoor is eenvoudig: u kunt de exitstatus van onderliggende processen niet krijgen door hun retourwaarde van de systeemmethode, alleen waar of onwaar. Als u de werkelijke retourwaarde van het onderliggende proces moet weten, moet u deze speciale globale variabele gebruiken. Nogmaals, de naam van deze variabele is ontleend aan de UNIX-shells.
  • $ _ - De laatste string gelezen door krijgt. Deze variabele kan een punt van verwarring zijn voor degenen die vanuit Perl naar Ruby komen. In Perl betekent de variabele $ _ iets soortgelijks, maar totaal anders. In Perl, $ _ bevat de waarde van de laatste instructie en in Ruby bevat deze de tekenreeks die wordt geretourneerd door de vorige krijgt aanroeping. Hun gebruik is vergelijkbaar, maar wat ze echt vasthouden is heel anders. Je ziet deze variabele ook niet vaak (als je erover nadenkt, zie je zelden een van deze variabelen), maar je ziet ze misschien in zeer korte Ruby-programma's die tekst verwerken.

Kortom, u zult zelden globale variabelen zien. Ze zijn vaak een slechte vorm (en "on-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 in ieder geval weten dat ze er zijn.