innehåll

Sfärer av synlighet, som rum i ett hus

När vi pratade om variabler nämnde vi att den vanligaste typen avvariabler är den ”lokala variabeln”, utan att förklara ytterligare varför de ärlokal. Lokalt till vad? Var? Vi är äntligen redo att förklara det mer.

eftersom vi nu har pratat om metoder kan vi också diskutera ett annat viktigtkoncept: scopes.

Wikipedia säger: ”i programmering, omfattningen av ett namn är den del av ett programdär namnet är giltigt: där namnet kan användas för att hänvisa till somethingelse.”(något modifierad för att matcha vår egen terminologi)

namn är kända (eller definierade) i ett visst omfång och okända (eller odefinierade)utanför detta omfång.

Du kan tänka på ett omfång som en sfär, en bubbla eller ett rum (med nowindows och dörrar stängda): vissa namn, som variabla namn, är ”kända” och”synliga” inuti rummet. Andra namn, kända och synliga i ett annat rum ärinte känt i det här rummet, men bara i det andra rummet.

varje gång det finns ett metodsamtal, och exekveringsflödet går in imetodens kropp, går det in i ett nytt omfång eller ”rum”. Saker som är ”lokala ”tilldenna metods omfattning (dvs. saker som är” inuti ” i rummet) är bara synliga i detta omfång. Utanför det är de okända.

Odefinierad lokal variabel eller metod

detta är också ett bra tillfälle att prata om ett felmeddelande som dukan se oftast. T. ex. ser du det varje gång när du gjorde ett stavfel och felstavade en variabel eller metodnamn.

Tänk på den här koden:

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

linjen puts add_two(2) kommer att mata ut 5, men linjen puts number kommer sedan att höja ett fel.

detta beror på att variabeln number som tilldelas numret 3 när wecall metoden är en lokal variabel. Det är lokalt för metodens omfattning. Detskapas när exekveringsflödet går in i metoden.

utanför detta omfång, när exekveringsflödet har återvänt från metodenmetodens omfattning har förstörts och alla lokala variabler är borta. Denlokala variabeln number är därför inte känd, och Ruby väcker ett fel som sägerundefined local variable or method 'number'.

om du tänker på det här felmeddelandet för lite, är det meningsfullt för dig?

Vi har tyst hoppat över det faktum att både lokala variablenames och metodnamn i Ruby skrivs på samma sätt: de är bara vanliga ord.Till exempel här:

number = 2puts number

number är en lokal variabel, och den används i raden puts number.

men här:

def number 2endputs number

number är namnet på en metod. Och det kan användas (kallas) i exakt sammasätt: puts number

detta beror på att Ruby, när det kör ett program, utvärderar ett uttalande efteren annan. Och när det stöter på ett vanligt ord som number kommer det först att kontrollera om det inom det aktuella omfånget känner till en lokal variabel med samename. Om så är fallet kommer det att använda det värde som är associerat med denna variabel. Omdet finns ingen lokal variabel med det här namnet, så kommer det att leta efter en metod. Om det inte finns någon metod med det här namnet kommer det då att höja felmeddelandetundefined local variable or method 'number'.

så felmeddelandet är ganska exakt, men låter också lite invecklat. VadDet försöker i princip säga är:

Du har använt ordet” nummer ” här, och jag vet inte det (i detta omfång). Menade du att använda en lokal variabel? Eller en metod?

är det vettigt?

tillbaka till ämnet lokala omfattningar. Låt oss titta på ett annat exempel:

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

vad tror du att utgången kommer att bli? Kommer det att vara 3, eller 5? Något annat?

om du kör koden ser du att den är 5.

anledningen till det är att vi tilldelar numret 1 I det yttre omfånget till avariable number, men denna variabel används då aldrig: den enda andra raden i det yttre omfånget är den sista raden puts add_to(3), och den här raden använder intevariabeln number.

istället, när styrflödet kommer in i metoden add_to Ruby kommer att skapa nytt lokalt omfång, och det kommer att definiera en ny lokal variabel number som isassigned numret 3 som skickades till metoden. Denna nya variabelnumber är lokal för metodens omfattning, och därför är detta en annanvariabel än den på den allra första raden, i det yttre omfånget.

Vi hittade följande en bra metafor för omfattningar:

När Ruby går in i en metod är det som om hon går in i ett glänsande nytt rum i ahouse. Med henne tar hon de föremål som skickas som argument tillmetod samtal. I exemplet ovan ger hon ett objekt som är numret 3.

nu, så snart Ruby går in i metoden, sticker hon post-it-anteckningar påobjekt, enligt argumentlistan från metoddefinitionen. I ourexample är det namnet number. Så från och med nu, i det här rummet finns det enkänd lokal variabel som har ett värde tilldelat: objektet (nummer) 3 med post-it-noten number på den.

i vårt exempel är det yttre omfånget och omfattningen av metoden add_two två olika rum, och det finns två olika Post-it-anteckningar fast påtvå olika nummer, som bara råkar ha samma namn på dem.

Lämna ett svar

Din e-postadress kommer inte publiceras.