Synlighedsfelter, som værelser i et hus
da vi talte om variabler, nævnte vi, at den mest almindelige type afvariabler er den “lokale variabel” uden at forklare yderligere, hvorfor de erlokale. Lokalt til hvad? Hvor? Vi er endelig klar til at forklare det mere.
da vi nu har talt om metoder, kan vi også diskutere et andet vigtigtkoncept: scopes.”i programmering er omfanget af et navn den del af et program, hvor navnet er gyldigt: hvor navnet kan bruges til at henvise til noget.”(let modificeret til at matche vores egen terminologi)
navne er kendt (eller defineret) i et bestemt omfang og ukendt (eller udefineret)uden for dette omfang.
Du kan tænke på et omfang som en kugle, en boble eller et rum (med vinduer og døre lukket): visse navne, som variable navne, er “kendte” og”synlige” inde i rummet. Andre navne, kendt og synlige i et andet rum erikke kendt i dette rum, men kun i det andet rum.
hver gang der er et metodeopkald, og strømmen af udførelse kommer ind imetodens krop, det går ind i et nyt omfang eller “rum”. Ting, der er” lokale “til denne metodes omfang (dvs.ting, der er” inde ” i rummet), er kun synlige i dette omfang. Uden for det er de ukendte.
udefineret lokal variabel eller metode
Dette er også en god mulighed for at tale om en fejlmeddelelse, som dukunne se oftest. Du kan f.eks. se det hver gang, du lavede en skrivefejl og stavede en variabel eller metodenavn forkert.
overvej denne kode:
def add_two(number) number + 2endputs add_two(3)puts number
linjenputs add_two(2)
vil output5
, men linjenputs number
vil derefter rejse en fejl.
dette skyldes, at variablen number
der er tildelt nummeret3
når vikalder metoden er en lokal variabel. Det er lokalt for metodens omfang. Detoprettes, når strømmen af udførelse går ind i metoden.
uden for dette anvendelsesområde, når strømmen af udførelse er vendt tilbage fra metodenmetodens omfang er blevet ødelagt, og alle lokale variabler er væk. Thelocal variabel number
er derfor ikke kendt, og Ruby rejser en fejl, der sigerundefined local variable or method 'number'
.
Hvis du tænker på denne fejlmeddelelse for lidt, er det fornuftigt atdu?
Vi har lydløst sprunget over det faktum, at i Ruby, både lokale variablenavne og metodenavne, er skrevet på samme måde: de er bare almindelige ord.For eksempel her:
number = 2puts number
number
er en lokal variabel, og den bruges i linjen puts number
.
men her:
def number 2endputs number
number
er navnet på en metode. Og det kan bruges (kaldet) på nøjagtig samme måde: puts number
Dette skyldes, at Ruby, når det udfører et program, evaluerer en erklæring efteren anden. Og når det støder på et almindeligt ord som number
så kontrollerer det først, om det inden for det nuværende omfang kender en lokal variabel med det samme navn. I så fald bruger den den værdi, der er knyttet til denne variabel. Hvisder er ingen lokal variabel med dette navn, så vil den se efter en metode. Hvis der heller ikke er nogen metode med dette navn, hæver den derefter fejlmeddelelsenundefined local variable or method 'number'
.
så fejlmeddelelsen er ret præcis, men lyder også slags indviklet. Hvad det dybest set forsøger at sige er:
Du har brugt ordet “nummer” her, og jeg ved det ikke (i dette omfang). Mente du at bruge en lokal variabel? Eller en metode?
giver det mening?
Tilbage til emnet lokale anvendelsesområder. Lad os se på et andet eksempel:
number = 1def add_to(number) number + 2endputs add_to(3)
hvad tror du output vil være? Vil det være 3
, eller 5
? Noget andet?
Hvis du kører koden, vil du se, at det er5
.
årsagen til det er, at vi tildeler nummeret 1
i det ydre omfang til avariable number
, men denne variabel bruges derefter aldrig: den eneste anden linje i det ydre omfang er den sidste linje puts add_to(3)
, og denne linje bruger ikkevariablen number
.
i stedet, når kontrolstrømmen går ind i metodenadd_to
Ruby vil skabe nyt lokalt omfang, og det vil definere en ny lokal variabelnumber
som er tildelt nummeret3
der blev overført til metoden. Denne nye variabelnumber
er lokal for metodens omfang, og derfor er dette en anderledesvariabel end den på den allerførste linje i det ydre omfang.
Vi fandt følgende en god metafor for scopes:
Når Ruby går ind i en metode, er det som om hun kommer ind i et skinnende nyt rum i ahouse. Med hende bringer hun de objekter, der sendes som argumenter tilmetode opkald. I eksemplet ovenfor bringer hun et objekt, der er tallet 3
.
nu, så snart Ruby går ind i metoden, stikker hun post-it noter påobjekter, ifølge argumentlisten fra metodedefinitionen. I vores eksempel er det navnet number
. Så fra nu af er der i dette rum en kendt lokal variabel, der har en værdi tildelt: objektet (nummer) 3
med post-it note number
på det.
i vores eksempel er det ydre omfang og omfanget af metoden add_two
, to forskellige rum, og der er to forskellige post-it-noter fast påto forskellige tal, som bare tilfældigvis har samme navn på dem.