Globaalit muuttujat Rubyssa

Globaalit muuttujat ovat muuttujat joita voidaan käyttää mistä tahansa ohjelman kohdasta riippumatta. Ne merkitään alussa merkillä $ (dollarimerkki). Globaalien muuttujien käyttöä pidetään kuitenkin usein "epä-Ruby" -näytönä, ja näet niitä harvoin.

Globaalien muuttujien määritteleminen

Globaalit muuttujat määritetään ja niitä käytetään kuten mitä tahansa muuta muuttujaa. Määritä ne määrittelemällä heille vain arvo ja aloita niiden käyttö. Mutta kuten heidän nimensä osoittaa, globaaleille muuttujille osoittamisella mistä tahansa ohjelman kohdasta on globaaleja vaikutuksia. Seuraava ohjelma osoittaa tämän. Menetelmä muuttaa globaalia muuttujaa, ja se vaikuttaa miten toinen menetelmä suoritetaan.


dollarin nopeus = 10. def kiihdytä. dollarin nopeus = 100. end. def pass_speed_trap. jos dollarin nopeus> 65. # Anna ohjelmalle ylinopeuslippu. end. end. nopeuttaa. pass_speed_trap. 

Epäsuosittu

Joten miksi tämä "un-Ruby" on ja miksi et näe globaaleja muuttujia kovin usein? Yksinkertaisesti sanottuna, se rikkoo koteloinnin. Jos jokin luokka tai menetelmä voi muokata globaalien muuttujien tilaa haluamallaan tavalla ilman rajapintakerrosta, mitään muut luokat tai menetelmät, jotka luottavat siihen globaaliin muuttujaan, voivat käyttäytyä odottamattomasti ja ei-toivotusti tavalla. Lisäksi sellaisia ​​vuorovaikutuksia voi olla erittäin vaikea korjata. Mikä muutti kyseistä globaalia muuttujaa ja milloin? Tarkastelet melko paljon koodia löytääksesi mitä se teki, ja se olisi voitu välttää estämättä kapseloinnin sääntöjä.

instagram viewer

Mutta se ei tarkoita, että globaalit muuttujat ovat ei koskaan käytetty Ruby. On olemassa erityisiä globaaleja muuttujia, joissa on yksimerkkisiä nimiä (a-la Perl), jota voidaan käyttää koko ohjelmassasi. Ne edustavat itse ohjelman tilaa ja tekevät muun muassa kaikkien tietueiden ja kenttien erottimia saa menetelmiä.

Globaalit muuttujat

  • $0 - Tämä muuttuja, jota merkitään dollarilla 0 (se on nolla), pitää yllä suoritetun ylimmän tason komentosarjan nimeä. Toisin sanoen, komentotiedosto, joka ajettiin komentorivi, ei komentotiedosto, joka sisältää parhaillaan suorittavan koodin. Niin jos script1.rb ajettiin komentoriviltä, ​​se pitää script1.rb. Jos tämä skripti vaatii script2.rb, 0 dollaria myös skriptitiedostossa olisi script1.rb. Nimi $ 0 heijastaa nimeämiskäytäntöä, jota käytetään UNIX-komentosarjoissa samaan tarkoitukseen.
  • $* - Järjestelmän komentoriviargumentit, jotka on merkitty dollarilla * (dollarin merkki ja tähdellä). Esimerkiksi jos joudut juostamaan ./script.rb arg1 arg2, sitten $ * olisi yhtä suuri kuin % w {arg1 arg2}. Tämä vastaa erityistä argv taulukko ja sillä on vähemmän kuvaava nimi, joten sitä käytetään harvoin.
  • $$ - Tulkin prosessitunnus, jota merkitään dollarilla (kaksi dollarin merkkiä). Oman prosessitunnuksen tunteminen on usein hyödyllistä daemon-ohjelmissa (jotka toimivat taustalla, kytkemättä päähän mistään päätelaitteesta) tai järjestelmäpalveluissa. Tämä tulee kuitenkin hieman monimutkaisemmaksi, kun langat ovat mukana, joten ole varovainen käyttäessäsi sitä sokeasti.
  • $ / ja $ \ - Nämä ovat tulo- ja lähtötietueiden erottimet. Kun luet esineitä käyttämällä saa ja tulosta ne käyttämällä puts, se käyttää näitä tietämään, milloin täydellinen "tietue" on luettu tai mitä tulostaa useiden tietueiden välillä. Oletuksena näiden tulisi olla uuden rivin merkki. Mutta koska nämä vaikuttavat kaikkien IO-esineiden käyttäytymiseen, niitä käytetään harvoin, jos ollenkaan. Saatat nähdä ne pienemmissä komentosarjoissa, joissa kotelointisääntöjen rikkominen ei ole ongelma.
  • $? - Viimeisen suoritetun alaprosessin poistotila. Kaikista tässä luetelluista muuttujista tämä on todennäköisesti hyödyllisin. Syy tähän on yksinkertainen: et voi saada lastenprosessien poistotilaa niiden paluuarvon perusteella järjestelmä menetelmä, vain totta tai vääriä. Jos sinun on tiedettävä lasten prosessin todellinen palautusarvo, sinun on käytettävä tätä erityistä globaalia muuttujaa. Tämän muuttujan nimi on jälleen otettu UNIX-kuorista.
  • $_ - Viimeinen lukema merkkijono saa. Tämä muuttuja saattaa olla hämmennyspiste niille, jotka saapuvat Rubylle Perlistä. Perlissa, $ _ muuttuja tarkoittaa jotain samanlaista, mutta täysin erilaista. Perlissa, $_ pitää viimeisen lauseen arvoa ja Ruby-tilassa se pitää edellisen palauttaman merkkijonon saa vetoaminen. Niiden käyttö on samanlaista, mutta mitä he todella pitävät, on hyvin erilainen. Et myöskään näe tätä muuttujaa (ajattele sitä, näet harvoin mitään näistä muuttujista), mutta saatat nähdä ne hyvin lyhyissä Ruby-ohjelmissa, jotka käsittelevät tekstiä.

Lyhyesti sanottuna, harvoin näet globaaleja muuttujia. Ne ovat usein huonossa muodossa (ja "un-Ruby") ja todella hyödyllisiä vain hyvin pienissä komentosarjoissa, joissa niiden käytön kaikki vaikutukset voidaan ymmärtää täysin. On olemassa muutamia erityisiä globaaleja muuttujia, joita voidaan käyttää, mutta suurimmaksi osaksi niitä ei käytetä. Sinun ei oikeastaan ​​tarvitse tietää kaikkea niin paljon globaaleista muuttujista, että ymmärrät useimmat Ruby-ohjelmat, mutta sinun on ainakin tiedettävä, että ne ovat olemassa.