obsah

sféry viditelnosti, jako jsou místnosti v domě

Když jsme hovořili o proměnných, zmínili jsme, že nejběžnějším typem proměnných je „místní proměnná“, aniž bychom dále vysvětlili, proč jsoumístní. Místní k čemu? Kde? Konečně jsme připraveni to více vysvětlit.

protože jsme nyní hovořili o metodách, můžeme také diskutovat o dalším důležitémkoncept: rozsahy.

Wikipedia říká: „V programování, rozsah jméno je součástí programwhere název je platný: kde název může být používán se odkazovat na něco, co.“(mírně upravené, aby odpovídaly naše vlastní terminologie)

Jména jsou známá (nebo je definován) v určitém rozsahu, a není známo (nebo nedefinované)mimo tento rozsah.

můžete přemýšlet o rozsahu jako koule, bublina nebo místnost (s nowindows a zavřenými dveřmi): určitá jména, jako názvy proměnných, jsou“ známá“a“ viditelná “ uvnitř místnosti. Jiná jména, známá a viditelná v jiné místnosti jsounení známo v této místnosti, ale pouze v jiné místnosti.

pokaždé, když dojde k volání metody a tok provádění vstoupí do těla metody, vstoupí do nového rozsahu nebo do „místnosti“. Věci, které jsou“ místní “ rozsahu této metody (tj. věci, které jsou „uvnitř“ místnosti), jsou viditelné pouze v tomto rozsahu. Mimo to nejsou známy.

Nedefinovaná místní proměnná nebo metoda

to je také dobrá příležitost mluvit o chybové zprávě, kterou byste mohli vidět nejčastěji. Např. uvidíte to pokaždé, když jste udělali překlepa chybně název proměnné nebo metody.

zvažte tento kód:

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

Na řádek puts add_two(2) výstup 5, ale řádek puts number willthen zvýšit chybu.

je to proto, že proměnná number je přiřazena číslu 3 když je metoda volána lokální proměnnou. Je to místní rozsah metody. Je vytvořen, když tok provádění vstoupí do metody.

mimo tento rozsah, když se tok provádění vrátil z metodyrozsah metody byl zničen a všechny místní proměnné jsou pryč. Proměnná number proto není známa a Ruby vyvolává chybu, která říkáundefined local variable or method 'number'.

pokud o této chybové zprávě přemýšlíte trochu, má to smysl?

tiše jsme přeskočili skutečnost, že v Ruby jsou místní proměnná jména i názvy metod psány stejným způsobem: jsou to jen prostá slova.Například zde:

number = 2puts number

number je lokální proměnná, a to je použito v řádku puts number.

zde však:

def number 2endputs number

number je název metody. A může být použit (nazýván) přesně stejnýmzpůsobem: puts number

je to proto, že Ruby, když provádí program, vyhodnotí jedno prohlášení za druhým. A když narazí na prosté slovo jako number pak to bude firstcheck pokud v současném rozsahu, to ví lokální proměnné s samename. Pokud ano, použije hodnotu, která je přidružena k této proměnné. Pokud s tímto názvem neexistuje žádná místní proměnná, bude hledat metodu. Ifthere ‚s také žádná metoda s tímto názvem se pak zvýší chybová zprávaundefined local variable or method 'number'.

takže chybová zpráva je docela přesná, ale také zní trochu spletitě. Co se v podstatě snaží říct, je:

zde jste použili slovo „číslo“ a já to nevím (v tomto rozsahu). Chtěli jste použít lokální proměnnou? Nebo metoda?

dává to smysl?

zpět k tématu místních rozsahů. Podívejme se na další příklad:

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

jaký bude podle vás výstup? Bude to 3, nebo 5? Ještě něco?

Pokud spustíte kód, uvidíte, že je 5.

důvodem pro to je, že děláme-li přiřadit číslo 1 ve vnějším rozsah dat proměnné number, ale tato proměnná je pak nikdy použity: jen další linie ve vnější působnosti je poslední řádek puts add_to(3), a tento řádek nebude-li použít proměnnou number.

Místo toho, když tok řízení přejde na metodu add_to Ruby bude vytvořit nový místní působnosti, a bude definovat nové lokální proměnné number, který isassigned číslo 3, který byl předán do metody. Tato nová proměnnánumber je lokální pro rozsah metody, a proto se jedná o jinou proměnnou než ta na prvním řádku ve vnějším rozsahu.

našli Jsme následující metaforou pro obory:

Když se Ruby vstupuje metodu, je to jako, že vstoupí zbrusu nové místnosti v domu. S ní přináší předměty, které jsou předávány jako argumenty k nimetoda volání. Ve výše uvedeném příkladu přináší objekt, který je číslo 3.

Nyní, jakmile Ruby vstoupí do metody, nalepí poznámky post-it na objekty podle seznamu argumentů z definice metody. V našem příkladu to je název number. Takže od teď, v této místnosti, tam je aknown lokální proměnnou, která má hodnotu přiřazenou: objekt (počet) 3 s post-it poznámka number.

V našem příkladu, vnější rozsah a působnost metodu add_two, aretwo různé pokoje, a tam jsou dvě různé post-it poznámky přilepená dvou různých čísel, které náhodou mají stejný název na nich.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.