tartalom

a láthatóság szférái, mint például a ház szobái

amikor változókról beszéltünk, megemlítettük, hogy a változók leggyakoribb típusa a “helyi változó”, anélkül, hogy tovább magyaráznánk, miért vannakhelyi. Mi a helyi? Hol? Végre készen állunk arra, hogy ezt tovább magyarázzuk.

mivel már beszéltünk a módszerekről, egy másik fontos fogalmat is megvitathatunk: hatókörök.

a Wikipedia azt mondja: “a programozásban a név hatóköre a Program részeahol a név érvényes: ahol a név használható valamire való hivatkozásra.”(kissé módosítva, hogy megfeleljen a saját terminológiánknak)

a nevek ismertek (vagy definiáltak)egy bizonyos hatókörben, és ismeretlenek (vagy meghatározatlanok) ezen a hatókörön kívül.

gondolhat egy hatókörre, mint egy gömbre, egy buborékra vagy egy szobára (ablakokkal és zárt ajtókkal): bizonyos nevek, mint például a változónevek, “ismertek” és”láthatóak” a szobán belül. Más nevek, ismert és látható egy másik szobában nem ismert ebben a szobában, de csak a másik szobában.

minden alkalommal, amikor van egy metódushívás, és a végrehajtás folyamata belép a metódus testébe, egy új hatókörbe vagy “szobába”lép be. Azok a dolgok, amelyek “lokálisak” a módszer hatóköréhez (azaz a helyiség “belsejében” lévő dolgokhoz), csak ebben a hatókörben láthatók. Ezen kívül ismeretlenek.

meghatározatlan helyi változó vagy módszer

Ez egy jó lehetőség arra is, hogy beszéljünk egy hibaüzenetről, amelyet leggyakrabban láthat. Például látni fogja, hogy minden alkalommal, amikor tett egy elírásés elgépelt változó vagy módszer nevét.

fontolja meg ezt a kódot:

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

a puts add_two(2)sor kiírja a 5sort, de a puts number sor hibát fog okozni.

Ez azért van, mert a numberváltozó, amelyhez a 3 szám van hozzárendelve, amikor a metódus helyi változó. Helyi a módszer hatóköre szempontjából. Ez akkor jön létre, amikor a végrehajtás folyamata belép a módszerbe.

Ezen a hatókörön kívül, amikor a végrehajtás folyamata visszatért a metódusbóla metódus hatóköre megsemmisült, és az összes helyi változó eltűnt. Thelocal változó number ezért nem ismert, és Ruby hibát vet fel, mondván:undefined local variable or method 'number'.

ha úgy gondolja, ez a hibaüzenet egy kicsit, van értelme, hogy Ön?

csendben átugorjuk azt a tényt, hogy a Ruby-ban mind a helyi változónevek, mind a metódusnevek ugyanúgy vannak írva: csak egyszerű szavak.Például itt:

number = 2puts number

number egy helyi változó, amelyet a puts numbersorban használnak.

itt azonban:

def number 2endputs number

number a módszer neve. Pontosan ugyanúgy használható (hívható) mód: puts number

Ez azért van, mert a Ruby, amikor végrehajtja a programot, kiértékeli az egyik utasítást a másik után. És amikor egy egyszerű szóval találkozik, mint a number, akkor először ellenőrzi, hogy a jelenlegi hatókörön belül ismeri-e az azonos nevű helyi változót. Ha igen, akkor a változóhoz társított értéket fogja használni. Ha nincs helyi változó ezzel a névvel, akkor keresni fog egy módszert. Ha nincs ilyen nevű módszer, akkor aundefined local variable or method 'number'hibaüzenet jelenik meg.

tehát a hibaüzenet elég pontos, de kissé zavartnak is hangzik. Amit alapvetően megpróbál mondani:

itt használtad a “szám” szót, és nem tudom (ebben a hatókörben). Lokális változót akartál használni? Vagy egy módszer?

van ennek értelme?

vissza a helyi hatókör témájához. Nézzünk meg egy másik példát:

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

szerinted mi lesz a kimenet? 3, vagy 5? Valami más?

ha futtatja a kódot, látni fogja, hogy ez 5.

ennek az az oka, hogy a külső hatókörben a 1 számot hozzárendeljük az avariable number számhoz, de ezt a változót soha nem használjuk: a külső hatókör egyetlen másik sora az utolsó sor puts add_to(3), és ez a sor nem használja a változót .

ehelyett, amikor a vezérlési folyamat belép a metódusbaadd_to A Ruby új helyi hatókört hoz létre, és meghatároz egy új helyi változótnumber amely a3 számhoz van rendelve, amelyet átadtak a metódusnak. Ez az új változónumber lokális a metódus hatóköréhez képest, ezért ez egy másik változó, mint a legelső sorban, a külső hatókörben.

a következő jó metaforát találtuk a hatókörökre:

amikor Ruby belép egy módszerbe, olyan, mintha egy fényes új szobába lépne be a házban. Vele hozza az objektumokat, amelyeket érvként adnak át amódszer hívás. A fenti példában egy objektumot hoz, amely a 3szám.

Most, amint Ruby belép a módszerbe, ragaszkodik a post-it jegyzetekhezobjektumok, a metódus definíciójának argumentumlistája szerint. A mi példánkban ez a név number. Tehát mostantól ebben a szobában van egy ismert helyi változó, amelynek értéke van hozzárendelve: az objektum (szám) 3 a post-it megjegyzéssel number rajta.

példánkban a külső hatókör és a módszer hatóköre add_two, két különböző szoba, és két különböző post-it jegyzet van ragasztva két különböző számra, amelyeknek csak ugyanaz a neve van.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.