Premenné inštancie v premenných Ruby

Káva so zavináčom

H&S Produktion / Getty Images





Premenné inštancie začínajú zavináčom (@) a možno na ne odkazovať iba v rámci metód triedy. Líšia sa od lokálnych premenných tým, že neexistujú v žiadnej konkrétnej rozsah . Namiesto toho je pre každú inštanciu triedy uložená podobná tabuľka premenných. Premenné inštancie žijú v rámci inštancie triedy, takže pokiaľ táto inštancia zostane nažive, budú existovať aj premenné inštancie.

Na premenné inštancie možno odkazovať v akejkoľvek metóde tejto triedy. Všetky metódy triedy používajú rovnakú inštanciu variabilná tabuľka , na rozdiel od lokálnych premenných, kde každá metóda bude mať inú tabuľku premenných. Je však možné pristupovať k premenným inštancie bez toho, aby ste ich predtým definovali. Toto nevyvolá výnimku, ale hodnota premennej bude nula a ak ste spustili Ruby s -v prepínač.



Tento príklad demonštruje použitie premenných inštancie. Všimnite si, že šebang obsahuje -v prepínač, ktorý vytlačí varovania, ak sa vyskytnú. Všimnite si tiež nesprávne použitie mimo metódy v rozsahu triedy. Toto je nesprávne a rozoberieme to nižšie.

Prečo je @test nesprávna premenná? To súvisí s rozsahom a tým, ako Ruby veci implementuje. V rámci metódy rozsah premennej inštancie odkazuje na konkrétnu inštanciu tejto triedy. Avšak v rozsahu triedy (v rámci triedy, ale mimo akýchkoľvek metód) je rozsah inštancia triedy rozsah. Ruby implementuje hierarchiu tried vytváraním inštancií Trieda predmetov, takže existuje a druhá inštancia v hre. Prvý príklad je príkladom Trieda trieda a toto je miesto @test pôjde. Druhým prípadom je inštancia TestClass , a toto je miesto @hodnota pôjde. Je to trochu mätúce, ale nezabudnite, že ho nikdy nepoužívajte @instance_variables mimo metód. Ak potrebujete úložisko pre celú triedu, použite @@premenné_triedy , ktorý možno použiť kdekoľvek v rozsahu triedy (v rámci metód alebo mimo nich) a bude sa správať rovnako.



Príslušenstvo

Normálne nemôžete pristupovať k premenným inštancie zvonku objektu. Napríklad vo vyššie uvedenom príklade nemôžete jednoducho zavolať t.hodnota alebo t.@value na prístup k premennej inštancie @hodnota . Tým by sa porušili pravidlá zapuzdrenie . Platí to aj pre inštancie podradených tried, ktoré nemajú prístup k premenným inštancie patriacej do nadradenej triedy, aj keď sú technicky rovnakého typu. Aby sme teda poskytli prístup k premenným inštancie, prístupový prvok metódy musia byť deklarované.

Nasledujúci príklad ukazuje, ako možno napísať metódy prístupového objektu. Všimnite si však, že Ruby poskytuje skratku a že tento príklad existuje len na to, aby vám ukázal, ako fungujú metódy prístupového objektu. Vo všeobecnosti nie je bežné vidieť metódy prístupového objektu napísané týmto spôsobom, pokiaľ nie je pre prístupový objekt potrebný nejaký druh dodatočnej logiky.

Vďaka skratkám sú veci o niečo jednoduchšie a kompaktnejšie. Existujú tri z týchto pomocných metód. Musia byť spustené v rozsahu triedy (v rámci triedy, ale mimo akýchkoľvek metód) a budú dynamicky definovať metódy podobne ako metódy definované vo vyššie uvedenom príklade. Nedeje sa tu žiadna mágia a vyzerajú ako jazykové kľúčové slová, ale v skutočnosti sú to len dynamicky definujúce metódy. Tieto doplnky zvyčajne patria na vrchol triedy. Čitateľ tak získa okamžitý prehľad o tom, ktoré členské premenné budú dostupné mimo triedy alebo pre podradené triedy.

Existujú tri z týchto metód prístupu. Každý z nich má zoznam symbolov popisujúcich premenné inštancie, ku ktorým sa má pristupovať.



    attr_reader- Definujte metódy „čítačky“, ako napr názov metóda vo vyššie uvedenom príklade.attr_writer- Definujte metódy „spisovateľa“, ako napr vek = metóda vo vyššie uvedenom príklade.attr_accessor- Definujte metódy „čítača“ aj „zapisovateľa“.

Kedy použiť premenné inštancie

Teraz, keď viete, čo sú premenné inštancie, kedy ich použijete? Premenné inštancie by sa mali použiť, keď predstavujú stav objektu. Meno a vek študenta, jeho známky atď. Nemali by sa používať na dočasné uloženie, na to slúžia lokálne premenné. Možno by sa však mohli použiť na dočasné ukladanie medzi volaniami metód pre viacstupňové výpočty. Ak to však robíte, možno budete chcieť prehodnotiť zloženie svojej metódy a namiesto toho urobiť z týchto premenných parametre metódy.