Globale variabler i Ruby

click fraud protection

Globale variabler er variabler som kan nås fra hvor som helst i programmet uansett omfang. De blir betegnet ved å begynne med et tegn på dollar (dollar). Imidlertid anses bruk av globale variabler ofte som "un-Ruby", og du vil sjelden se dem.

Definere globale variabler

Globale variabler er definert og brukt som alle andre variabler. For å definere dem, bare tilordne en verdi til dem og begynne å bruke dem. Men som navnet antyder, det å tilordne seg globale variabler fra et hvilket som helst punkt i programmet har globale implikasjoner. Følgende program demonstrerer dette. Metoden vil endre en global variabel, og det vil påvirke hvordan sekund metoden kjører.


$ hastighet = 10. def akselerere. $ hastighet = 100. slutt. def pass_speed_trap. hvis $ hastighet> 65. # Gi programmet en fartsbillett. slutt. slutt. akselerere. pass_speed_trap. 

upopulær

Så hvorfor er dette "un-Ruby", og hvorfor ser du ikke globale variabler veldig ofte? Enkelt sagt, det bryter innkapsling. Hvis en klasse eller metode kan endre tilstanden til de globale variablene etter behov uten grensesnittlag, er det noen andre klasser eller metoder som er avhengige av den globale variabelen, kan oppføre seg uventet og uønsket måte. Videre kan slike interaksjoner være svært vanskelige å feilsøke. Hva endret den globale variabelen, og når? Du vil se gjennom ganske mye kode for å finne hva som gjorde det, og det kunne vært unngått ved ikke å bryte reglene for innkapsling.

instagram viewer

Men det er ikke å si at det er globale variabler aldri brukt i Ruby. Det er en rekke spesielle globale variabler med ensbetegnelser (a-la Perl) som kan brukes i hele programmet. De representerer statusen for selve programmet, og gjør ting som å endre posten og feltutskillere for alle blir metoder.

Globale variabler

  • $0 - Denne variabelen, betegnet med $ 0 (det er en null), inneholder navnet på det øverste skriptet som blir kjørt. Med andre ord skriptfilen som ble kjørt fra kommandolinje, ikke skriptfilen som inneholder den nåværende utførende koden. Så hvis script1.rb ble kjørt fra kommandolinjen, ville det holde script1.rb. Hvis dette skriptet krever script2.rb, $ 0 i den skriptfilen vil også være script1.rb. Navnet $ 0 gjenspeiler navnekonvensjonen som ble brukt i UNIX shell scripting for samme formål.
  • $* - Kommandolinjeargumentene i en matrise betegnet med $ * (dollartegn og stjerne). For eksempel hvis du skulle løpe ./script.rb arg1 arg2, da ville $ * tilsvarer % w {arg1 arg2}. Dette tilsvarer det spesielle ARGV matrise og har et mindre beskrivende navn, så det blir sjelden brukt.
  • $$ - Tolkens prosess-ID, betegnet med $$ (to dollartegn). Å kjenne til egen prosess-ID er ofte nyttig i daemon-programmer (som kjører i bakgrunnen, uten tilknytning fra noen terminal) eller systemtjenester. Dette blir imidlertid litt mer komplisert når tråder er involvert, så vær på vakt mot å bruke det blindt.
  • $ / og $ \ - Dette er inndata- og utdataportseparatorer. Når du leser objekter med blir og skriv dem ut ved å bruke puts, bruker den disse for å vite når en komplett "post" er lest, eller hva som skal skrives ut mellom flere poster. Som standard skal disse være det nye linjetegnet. Men siden disse påvirker oppførselen til alle IO-objekter, blir de sjelden brukt, om i det hele tatt. Du kan se dem i mindre skript der det ikke er noe problem å bryte innkapslingsreglene.
  • $? - Utgangsstatus for den siste barneprosessen som ble utført. Av alle variablene som er oppført her, er dette sannsynligvis den mest nyttige. Årsaken til dette er enkel: du kan ikke få utgangsstatus for barneprosesser etter deres returverdi fra system metode, bare sant eller usant. Hvis du må vite den faktiske returverdien for barneprosessen, må du bruke denne spesielle globale variabelen. Igjen er navnet på denne variabelen hentet fra UNIX-skjellene.
  • $_ - Den siste strengen lest av blir. Denne variabelen kan være et forvirringspunkt for de som kommer til Ruby fra Perl. I Perl, the variabel $ _ betyr noe lignende, men helt annerledes. I Perl, $_ har verdien av den siste uttalelsen, og i Ruby holder den strengen returnert av den forrige blir påkalling. Bruken av dem er lik, men hva de virkelig har er veldig forskjellig. Du ser ikke ofte denne variabelen (tenk på det, du ser sjelden noen av disse variablene), men du kan se dem i veldig korte Ruby-programmer som behandler tekst.

Kort sagt, du vil sjelden se globale variabler. De er ofte dårlig form (og "un-Ruby") og bare veldig nyttige i veldig små skript, der hele implikasjonen av bruken deres kan bli satt pris på. Det er noen spesielle globale variabler som kan brukes, men for det meste brukes de ikke. Du trenger ikke egentlig å vite så mye om globale variabler for å forstå de fleste Ruby-programmer, men du bør i det minste vite at de er der.

instagram story viewer