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 slut def pass_speed_trap om $ hastighet> 65 # Ge programmet en snabba biljett slutänd 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 modifiera tillståndet för de globala variablerna som helst utan gränssnittslager, kan andra klasser eller metoder som förlitar sig på den globala variabeln uppträda på 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 mot reglerna för inkapsling.

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 namn på enstaka tecken (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 noll), innehåller namnet på det översta skriptet som körs. Med andra ord skriptfilen som kördes från kommandoraden, 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 den speciella ARGV-matrisen 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, den använder dessa för att veta när en fullständig "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ångsstatus 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 enkelt: du kan inte få utgångsstatus för barnprocesser genom deras returvärde från systemmetoden, 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 betyder $ _-variabeln 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 ofta 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.