Globale variabler er variabler der kan fås adgang til hvor som helst i programmet uanset omfang. De betegnes ved at begynde med et $ (dollartegn) tegn. Imidlertid betragtes brugen af globale variabler ofte som "un-Ruby", og du vil sjældent se dem.
Definition af globale variabler
Globale variabler defineres og bruges som enhver anden variabel. For at definere dem skal du blot tildele en værdi til dem og begynde at bruge dem. Men som deres navn antyder, at tildeling til globale variabler fra ethvert punkt i programmet har globale konsekvenser. Følgende program demonstrerer dette. Metoden vil ændre en global variabel, og det vil påvirke, hvordan anden metoden kører.
$ hastighed = 10. def accelerere. $ hastighed = 100. ende. def pass_speed_trap. hvis $ hastighed> 65. # Giv programmet en hurtig billet. ende. ende. fremskynde. pass_speed_trap.
upopulære
Så hvorfor er dette "un-Ruby", og hvorfor ser du ikke globale variabler meget ofte? Kort sagt, det bryder indkapsling. Hvis en klasse eller metode kan ændre tilstanden for de globale variabler efter eget ønske uden grænsefladelag, er der nogen andre klasser eller metoder, der er afhængige af den globale variabel, kan opføre sig uventet og uønsket måde. Yderligere kan sådanne interaktioner være meget vanskelige at fejlsøge. Hvad ændrede den globale variabel, og hvornår? Du kigger gennem en hel del kode for at finde ud af, hvad der gjorde det, og det kunne have været undgået ved ikke at bryde reglerne for indkapsling.
Men det er ikke at sige, at det er globale variabler aldrig brugt i Ruby. Der er en række specielle globale variabler med navne på enkelt tegn (a-la Perl), der kan bruges i hele dit program. De repræsenterer status for selve programmet og gør ting som at ændre post- og feltudskillere for alle får metoder.
Globale variabler
- $0 - Denne variabel, betegnet med $ 0 (det er et nul), indeholder navnet på det øverste niveau script, der udføres. Med andre ord, scriptfilen, der blev kørt fra kommandolinje, ikke den scriptfil, der har den aktuelt udførte kode. Så hvis script1.rb blev kørt fra kommandolinjen, ville det holde script1.rb. Hvis dette script kræver det script2.rb, $ 0 i den scriptfil ville også være script1.rb. Navnet $ 0 spejler navnekonventionen, der blev brugt i UNIX-shell-scripting til samme formål.
- $* - Kommandolinjeargumenterne i en matrix betegnet med $ * (dollartegn og stjerne). For eksempel, hvis du skulle løbe ./script.rb arg1 arg2, ville $ * svare til % w {arg1 arg2}. Dette svarer til det særlige argv array og har et mindre beskrivende navn, så det sjældent bruges.
- $$ - Tolkens proces-id, betegnet med $$ (to dollartegn). At kende ens egen proces-id er ofte nyttigt i daemon-programmer (som kører i baggrunden, ikke tilknyttet fra en hvilken som helst terminal) eller systemtjenester. Dette bliver dog lidt mere kompliceret, når der er tale om tråde, så vær forsigtig med at bruge det blindt.
- $ / og $ \ - Dette er input- og output-record-separatorerne. Når du læser objekter ved hjælp af får og udskriv dem med puts, bruger det disse til at vide, hvornår en komplet "post" er blevet læst, eller hvad der skal udskrives mellem flere poster. Som standard skulle disse være den nye linjetegn. Men da disse påvirker opførslen af alle IO-objekter, bruges de sjældent, hvis overhovedet. Du kan se dem i mindre scripts, hvor det ikke er et problem at bryde indkapslingsreglerne.
- $? - Udgangsstatus for den sidste udførte barneproces. Af alle de variabler, der er anført her, er dette sandsynligvis den mest nyttige. Årsagen til dette er enkel: Du kan ikke få exit-status for børneprocesser ved deres returværdi fra system metode, kun sand eller falsk. Hvis du skal kende den faktiske returværdi for barneprocessen, skal du bruge denne specielle globale variabel. Igen er navnet på denne variabel hentet fra UNIX skaller.
- $_ - Den sidste streng læst af får. Denne variabel kan være et forvirringspunkt for dem, der kommer til Ruby fra Perl. I Perl, the variabel $ _ betyder noget lignende, men helt anderledes. I Perl, $_ har værdien af den sidste erklæring, og i Ruby holder den den streng, der er returneret af den forrige får påkaldelse. Deres brug er ens, men hvad de virkelig har er meget forskellige. Man ser ofte ikke denne variabel (kom til at tænke på den, du ser sjældent nogen af disse variabler), men du kan se dem i meget korte Ruby-programmer, der behandler tekst.
Kort sagt, du vil sjældent se globale variabler. De er ofte dårlig form (og "un-Ruby") og er kun rigtig nyttige i meget små manuskripter, hvor den fulde implikation af deres brug kan forstås fuldt ud. Der er et par særlige globale variabler, der kan bruges, men for det meste bruges de ikke. Du behøver ikke rigtig at vide så meget om globale variabler for at forstå de fleste Ruby-programmer, men du skal i det mindste vide, at de er der.