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.