Innhold

sfærer av synlighet, som rom i et hus

Når Vi snakket om variabler nevnte vi at den vanligste typenvariabler er den «lokale variabelen», uten å forklare videre hvorfor de erlokale. Lokal til hva? Hvor? Vi er endelig klare til å forklare det mer.

siden vi nå har snakket om metoder, kan vi også diskutere et annet viktig konsept: omfang.

Wikipedia sier: «i programmering er omfanget av et navn den delen av et programhvor navnet er gyldig: hvor navnet kan brukes til å referere til noe.»(litt modifisert for å matche vår egen terminologi)

Navn er kjent (eller definert)i et bestemt omfang, og ukjent (eller udefinert) utenfor dette omfanget.

Du kan tenke på et omfang som en sfære, en boble eller et rom (med nowindows og dører lukket): Visse navn, som variable navn, er «kjent» og «synlig» inne i rommet. Andre navn, kjent og synlig i et annet rom erikke kjent i dette rommet, men bare i det andre rommet.

Hver gang det er et metodekall, og utførelsesflyten kommer innmetodens kropp, den går inn i et nytt omfang, eller «rom». Ting som er» lokale «til denne metodens omfang (dvs. ting som er «inne» i rommet), er onlyvisible i dette omfanget. Utenfor det er de ukjente.

Udefinert lokal variabel eller metode

dette er også en god mulighet til å snakke om en feilmelding som dumå se oftest. F. eks du vil se det hver gang når du har gjort en skrivefeil og feilstavet en variabel eller metode navn.

Vurder denne koden:

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

linjen puts add_two(2) vil sende 5, men linjen puts number vil deretter heve en feil.

dette skyldes at variabelen number som er tildelt nummeret 3 når wecall metoden er en lokal variabel. Det er lokalt for metodens omfang. Detopprettet når utførelsesflyten går inn i metoden.

Utenfor dette omfanget, når flyten av kjøring er returnert fra metodenmetodens omfang er ødelagt, og alle lokale variabler er borte. Den lokale variabelen number er derfor ikke kjent,Og Ruby reiser en feil som sier undefined local variable or method 'number'.

hvis du tenker på denne feilmeldingen for litt, er det fornuftig ådu?

Vi har stille hoppet over det faktum at I Ruby, både lokale variablenavn og metodenavn, er skrevet på samme måte: de er bare enkle ord.For eksempel, her:

number = 2puts number

number er en lokal variabel, og den brukes i linjen puts number.

Men her:

def number 2endputs number

number er navnet på en metode. Og det kan brukes (kalt) i nøyaktig sameway: puts number

Dette er fordi Ruby, når Den utfører et program, evaluerer en setning etteren annen. Og når det møter et vanlig ord som number så vil det førstsjekke om det i det nåværende omfanget kjenner en lokal variabel med samenavnet. I så fall vil den bruke verdien som er knyttet til denne variabelen. Hvisdet er ingen lokal variabel med dette navnet, så vil det se etter en metode. Hvis det ikke er noen metode med dette navnet, vil det da øke feilmeldingenundefined local variable or method 'number'.

så feilmeldingen er ganske presis, men høres også litt innviklet ut. Whatit prøver i utgangspunktet å si er:

du har brukt ordet «nummer» her, og jeg vet ikke det (i dette omfanget). Mente du å bruke en lokal variabel? Eller en metode?

gir det mening ?

Tilbake til emnet for lokale omfang. La oss se på et annet eksempel:

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

hva tror du utgangen vil være? Vil det være 3, eller 5? Noe annet?

hvis du kjører koden vil du se at det er5.

årsaken til det er at vi tilordner nummeret 1 i ytre omfang til avariable number, men denne variabelen blir da aldri brukt: den eneste andre linjen i ytre omfang er den siste linjen puts add_to(3), og denne linjen bruker ikkevariabelen number.

I Stedet, når kontrollflyten går inn i metodenadd_to Ruby vil opprette nytt lokalt omfang, og det vil definere en ny lokal variabel number som tilordnes nummeret 3 som ble sendt til metoden. Denne nye variabelennumber er lokal for metodens omfang, og derfor er dette en annenvariabel enn den på den aller første linjen, i ytre omfang.

Vi fant følgende en god metafor for omfang:

Når Ruby går inn i en metode, er det som om Hun går inn i et skinnende nytt rom i ahouse. Med henne bringer hun objektene som er bestått som argumenter tilmetode samtale. I eksemplet ovenfor bringer hun et objekt som er tallet 3.

Nå, Så snart Ruby går inn i metoden, stikker hun post-it-notater påobjekter, i henhold til argumentlisten fra metodedefinisjonen. I ourexample er det navnet number. Så fra nå av, i dette rommet, er det akjent lokal variabel som har en verdi tildelt: objektet (nummer)3 med post-it-notatetnumber på den.

i vårt eksempel er det ytre omfanget og omfanget av metodenadd_two, to forskjellige rom, og det er to forskjellige post-it-notater fast påto forskjellige tall, som bare tilfeldigvis har samme navn på dem.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.