Globala variabler i Ruby

Globala variabler är variabler som kan nås var som helst i programmet oavsett omfattning. De betecknas genom att börja med ett tecken på $ (dollartecken). Men användningen av globala variabler betraktas ofta som "un-Ruby", och du kommer sällan att se dem.

Definiera globala variabler

Globala variabler definieras och används som alla andra variabler. För att definiera dem tilldelar du bara ett värde till dem och börjar använda dem. Men som deras namn antyder har tilldelning till globala variabler från vilken punkt som helst i programmet globala konsekvenser. Följande program visar detta. Metoden kommer att modifiera en global variabel, och det kommer att påverka hur andra metod körs.


$ hastighet = 10. def accelerera. $ hastighet = 100. slutet. def pass_speed_trap. om $ hastighet> 65. # Ge programmet en snabb biljett. slutet. slutet. accelerera. pass_speed_trap. 

Impopulär

Så varför är detta "un-Ruby" och varför ser du inte globala variabler så ofta? Enkelt uttryckt, det bryter inkapslingen. Om någon klass eller metod kan ändra tillståndet för de globala variablerna som helst utan gränssnittslager, någon andra klasser eller metoder som förlitar sig på den globala variabeln kan uppträda i ett oväntat och oönskat sätt. Vidare kan sådana interaktioner vara mycket svåra att felsöka. Vad modifierade den globala variabeln och när? Du kommer att titta igenom en hel del kod för att hitta vad som gjorde det, och det kunde ha undvikits genom att inte bryta reglerna för inkapsling.

instagram viewer

Men det är inte att säga att globala variabler är det aldrig används i Ruby. Det finns ett antal speciella globala variabler med enda teckennamn (a-la Perl) som kan användas i hela ditt program. De representerar själva programmets tillstånd och gör saker som att ändra post- och fältavskiljare för alla blir metoder.

Globala variabler

  • $0 - Denna variabel, betecknad med $ 0 (det är en noll), innehåller namnet på det översta skriptet som körs. Med andra ord skriptfilen som kördes från kommandorad, inte skriptfilen som har den aktuella exekverande koden. Så om script1.rb kördes från kommandoraden, skulle det hålla script1.rb. Om detta skript kräver script2.rb, $ 0 i den skriptfilen skulle också vara script1.rb. Namnet $ speglar namngångskonventionen som används i UNIX-skalskript för samma ändamål.
  • $* - Kommandoradsargumenten i en matris betecknad med $ * (dollartecken och asterisk). Om du till exempel skulle springa ./script.rb arg1 arg2, då $ * skulle motsvara % w {arg1 arg2}. Detta motsvarar det speciella argv array och har ett mindre beskrivande namn, så det används sällan.
  • $$ - Tolkens process-ID, betecknat med $$ (två dollartecken). Att känna till sin egen process-ID är ofta användbar i daemon-program (som körs i bakgrunden, utan koppling från någon terminal) eller systemtjänster. Detta blir dock lite mer komplicerat när trådar är involverade, så var försiktig med att använda det blint.
  • $ / och $ \ - Dessa är ingångs- och utgångsregistreringsavskiljare. När du läser objekt med blir och skriv ut dem med sätter, använder de dessa för att veta när en komplett "post" har lästs, eller vad som ska skrivas ut mellan flera poster. Som standard bör dessa vara det nya linjetecknet. Men eftersom dessa påverkar beteendet hos alla IO-objekt, används de sällan, om inte alls. Du kan se dem i mindre skript där det inte är något problem att bryta inkapslingsreglerna.
  • $? - Utgångsstatusen för den sista barnprocessen som utförts. Av alla variabler som listas här är detta förmodligen den mest användbara. Anledningen till detta är enkel: du kan inte få utgångsstatus för barnprocesser genom deras returvärde från systemet metod, endast sant eller falskt. Om du måste känna till det faktiska returvärdet för barnprocessen, måste du använda denna speciella globala variabel. Återigen är namnet på denna variabel hämtad från UNIX-skalen.
  • $_ - Den sista strängen läst av blir. Denna variabel kan vara en förvirringspunkt för dem som kommer till Ruby från Perl. I Perl, $ _ variabel betyder något liknande, men helt annorlunda. I Perl, $_ innehar värdet på det sista uttalandet och i Ruby håller det strängen som returnerades av föregående blir åkallan. Deras användning är likadant, men vad de verkligen har är mycket annorlunda. Du ser inte heller denna variabel (kom att tänka på den, du ser sällan någon av dessa variabler), men du kan se dem i mycket korta Ruby-program som bearbetar text.

Kort sagt, du kommer sällan att se globala variabler. De är ofta dålig form (och "un-Ruby") och bara riktigt användbara i mycket små skript, där den fulla implikationen av deras användning kan uppskattas fullt ut. Det finns några speciella globala variabler som kan användas, men för det mesta används de inte. Du behöver egentligen inte veta så mycket om globala variabler för att förstå de flesta Ruby-program, men du borde åtminstone veta att de är där.