Contents

näkyvyyden sfäärit, kuten huoneet talossa

kun puhuimme muuttujista, mainitsimme, että yleisin variables-tyyppi on ”paikallinen muuttuja”, selittämättä sen enempää, miksi ne ovat paikallisia. – Minkä paikallisia? Missä? Olemme vihdoin valmiita selittämään sitä lisää.

koska olemme nyt puhuneet menetelmistä, voimme keskustella myös toisesta tärkeästä aiheesta: scopes.

Wikipedia sanoo: ”ohjelmoinnissa nimen laajuus on se osa ohjelmaa, jossa nimi on voimassa: missä nimeä voidaan käyttää viittaamaan johonkin.”(hieman muokattu vastaamaan omaa terminologiaamme)

nimet tunnetaan (tai määritellään) tietyssä laajuudessa ja tuntemattomat (tai määrittelemättömät)tämän laajuuden ulkopuolella.

skaalaa voi ajatella palloksi, kuplaksi tai huoneeksi (jossa on nowindows ja ovet suljettuina): tietyt nimet, kuten vaihtuvat nimet, ovat ”tunnettuja” ja”näkyviä” huoneen sisällä. Muita nimiä, jotka tunnetaan ja näkyvät toisessa huoneessa, ei tunneta tässä huoneessa, vaan ainoastaan toisessa huoneessa.

joka kerta, kun on metodikutsu, ja suoritusvirtaus saapuu themethodin kehoon, se siirtyy uuteen ulottuvuuteen eli ”huoneeseen”. Asiat, jotka ovat ” paikallisia ”tämän menetelmän soveltamisala (ts.asioita, jotka ovat” sisällä ” huoneeseen), ovat vain näkyvillä tässä soveltamisala. Sen ulkopuolella heitä ei tunneta.

määrittelemätön paikallinen muuttuja tai menetelmä

Tämä on myös hyvä tilaisuus puhua virheilmoituksesta, jonka saatat nähdä useimmin. Esim. näet sen joka kerta, kun teit kirjoitusvirheen ja kirjoitit muuttujan tai menetelmän nimen väärin.

harkitse tätä koodia:

def add_two(number) number + 2endputs add_two(3)puts number

rivi puts add_two(2) tuottaa 5, mutta rivi puts number nostaa virheen.

Tämä johtuu siitä, että muuttuja number, jolle annetaan numero 3, kun menetelmä on paikallinen muuttuja. Se on paikallinen menetelmän soveltamisala. Se luodaan, kun suorituksen virtaus tulee menetelmään.

tämän soveltamisalan ulkopuolella, kun suoritusvirta on palautunut menetelmästä, menetelmän soveltamisala on tuhoutunut ja kaikki paikalliset muuttujat ovat poissa. Thelocal muuttuja number ei siis ole tiedossa, ja Ruby nostaa virheen sanoenundefined local variable or method 'number'.

Jos tätä virheviestiä vähän miettii, onko siinä järkeä?

olemme hiljaa sivuuttaneet sen, että Rubyssa sekä paikalliset muunneltavat Nimet että metodin nimet kirjoitetaan samalla tavalla: ne ovat vain pelkkiä sanoja.Esimerkiksi tässä:

number = 2puts number

number on paikallinen muuttuja, ja sitä käytetään rivillä puts number.

kuitenkin tässä:

def number 2endputs number

number on menetelmän nimi. Ja sitä voidaan käyttää (kutsutaan) täsmälleen samalla tavalla: puts number

Tämä johtuu siitä, että Ruby arvioi ohjelman suorittaessaan yhden lausekkeen toisen jälkeen. Ja kun se kohtaa yksinkertaisen sanan, kuten number, se tarkistaa ensin, osaako se nykyisen soveltamisalan puitteissa paikallisen muuttujan, jolla on sama nimi. Jos näin on, se käyttää tähän muuttujaan liittyvää arvoa. Jos tällä nimellä ei ole paikallista muuttujaa, se etsii menetelmää. Jos tällä nimellä ei ole myöskään menetelmää, se nostaa virhesanomanundefined local variable or method 'number'.

virheilmoitus on siis melko tarkka, mutta kuulostaa myös jotenkin mutkikkaalta. Whatit pohjimmiltaan yrittää sanoa on:

olet käyttänyt sanaa ”numero” tässä, enkä tiedä sitä (tässä laajuudessa). Tarkoititko käyttää paikallista muuttujaa? Tai menetelmä?

onko siinä järkeä?

takaisin aiheeseen paikallisista laajuuksista. Katsotaanpa toista esimerkkiä:

number = 1def add_to(number) number + 2endputs add_to(3)

Mitä luulet tulosteen olevan? Onko se 3 vai 5? Jotain muuta?

Jos käytät koodia, näet, että se on 5.

syynä tähän on se, että annamme numeron 1 ulommassa laajuudessa avariable number, mutta tätä muuttujaa ei sitten koskaan käytetä: ulommassa laajuudessa ainoa muu rivi on viimeinen rivi puts add_to(3), eikä tämä rivi käytä muuttujaa number.

sen sijaan kontrollivirran saapuessa menetelmään add_to Ruby luo uuden paikallisen ulottuvuuden, ja se määrittää uuden paikallisen muuttujan number, johon on liitetty menetelmään siirretty luku 3. Tämä uusi muuttujanumber on paikallinen menetelmän soveltamisalalle, ja siksi tämä on eri muuttuja kuin aivan ensimmäisellä rivillä, ulommassa soveltamisalassa.

löysimme seuraavan hyvän metaforan scopesille:

kun Ruby astuu metodiin, on kuin hän astuisi kiiltävään uuteen huoneeseen ahousessa. Hänen kanssaan hän tuo esineet, jotka välitetään argumentteina themethod call. Yllä olevassa esimerkissä hän tuo objektin, joka on luku 3.

nyt, heti kun Ruby astuu metodiin, hän pistää post-it-muistiinpanot theobjekteihin, metodimääritelmän argumenttilistan mukaan. Ourexamplessa se on nimi number. Joten tästä lähtien tässä huoneessa on tunnettu paikallinen muuttuja, jolle on annettu arvo: objekti (numero) 3 post-it note number sille.

esimerkissämme ulompi soveltamisala ja menetelmän soveltamisala add_two, ovat kaksi eri huonetta, ja on kaksi erilaista post-it-lappua, jotka ovat kiinni kahdessa eri numerossa, joissa vain sattuu olemaan sama nimi.

Vastaa

Sähköpostiosoitettasi ei julkaista.