Pozrite sa na všetky objektovo orientovaný kód a to všetko viac či menej podľa rovnakého vzoru. Vytvorte objekt, zavolajte na tento objekt niektoré metódy a získajte prístup k atribútom tohto objektu. S objektom nemôžete robiť nič iné, iba ho odovzdať ako parameter metóde iného objektu. Ale to, čo nás zaujíma, sú atribúty.
Atribúty sú podobné premenné inštancie získate prístup prostredníctvom notácie bodových objektov. Napríklad, person.name bude mať prístup k menu osoby. Podobne môžete často priradiť atribúty ako person.name = "Alice". Je to podobná funkcia ako premenné členov (napríklad v C ++), ale nie úplne rovnaké. Neexistuje nič zvláštne, atribúty sú implementované vo väčšine jazykov pomocou „getters“ a „setters“ alebo metód, ktoré získavajú a nastavujú atribúty z premenných inštancie.
Ruby nerozlišuje medzi získavačmi a nastavovačmi atribútov a bežnými metódami. Vďaka syntaxi Rubyho flexibilnej metódy volania nie je potrebné rozlišovať. Napríklad, person.name a person.name () sú to isté, čomu hovoríš
názov metóda s nulovými parametrami. Jeden vyzerá ako volanie metódy a druhý vyzerá ako atribút, ale v skutočnosti sú to isté. Obaja len volajú názov metóda. Podobne je možné v priradení použiť akýkoľvek názov metódy, ktorý končí znamienkom rovnosti (=). Výkaz person.name = "Alice" je skutočne to isté ako person.name = (Alice), aj keď medzi menom atribútu a znamienkom rovnosti je medzera, stále sa volá iba znak name = metóda.Atribúty môžete ľahko implementovať sami. Definovaním metód setter a getter môžete implementovať akýkoľvek požadovaný atribút. Tu je príklad kódu implementujúceho názov Atribút pre triedu osôb. Názov uloží do a @názov premenná inštancie, ale názov nemusí byť rovnaký. Pamätajte, že o týchto metódach nie je nič zvláštne.
Jedna vec, ktorú si hneď všimnete, je, že je to veľa práce. Je to veľa písania len povedať, že chcete atribút s názvom názov ktorý pristupuje k internetu @názov premenná inštancie. Našťastie Ruby poskytuje niekoľko metód pohodlia, ktoré budú tieto metódy definovať za vás.
V systéme existujú tri metódy modul triedy, ktorú môžete použiť vo vyhláseniach o triede. Pamätajte, že Ruby nerozlišuje medzi runtime a „compile time“ a akýkoľvek kód vo vnútri deklarácií triedy môže nielen definovať metódy, ale aj metódy volania. Volá sa attr_reader, attr_writer a attr_accessor Tieto metódy potom definujú nastavovateľov a prijímačov, ktoré sme sami definovali v predchádzajúcej časti.
attr_reader metóda robí rovnako ako to, čo znie, ako to bude robiť. Trvá ľubovoľný počet parametrov symbolu a pre každý parameter definuje metódu „getter“, ktorá vracia premennú inštancie s rovnakým názvom. Môžeme teda nahradiť naše názov metóda v predchádzajúcom príklade s attr_reader: meno.
Podobne aj attr_writer metóda definuje metódu "nastavovača" pre každý symbol, ktorý sa k nemu odovzdáva. Všimnite si, že znamienko rovnosti nemusí byť súčasťou symbolu, iba názov atribútu. Môžeme nahradiť name = metóda z predchádzajúceho príkladu s volaním na attr_writier: meno.
A podľa očakávania attr_accessor robí prácu oboch attr_writer a attr_reader. Ak potrebujete atribút a nastavovač aj pre získanie atribútu, je bežnou praxou nevolať tieto dve metódy osobitne a namiesto toho zavolať attr_accessor. Mohli by sme ich nahradiť oba názov a name = metódy z predchádzajúceho príkladu s jediným volaním na attr_accessor: meno.
Prečo by ste mali definovať nastavovače manuálne? Prečo nepoužiť attr_ * metódy zakaždým? Pretože prerušujú zapuzdrenie. Zapuzdrenie je princíp, ktorý uvádza, že žiadna vonkajšia entita by nemala mať neobmedzený prístup k vnútornému stavu vášho objektov. Ku všetkému by sa malo pristupovať pomocou rozhrania, ktoré zabráni užívateľovi poškodiť vnútorný stav objektu. Použitím vyššie uvedených metód sme prelomili veľkú dieru v našej enkapsulačnej stene a umožnili sme, aby sa pre meno dalo nastaviť absolútne čokoľvek, dokonca zjavne neplatné mená.
Jedna vec, ktorú často uvidíte, je to attr_reader sa bude používať na rýchle definovanie getra, ale vlastný setter bude definovaný, pretože interný stav objektu často chce byť čítať priamo z vnútorného štátu. Nastavovač je potom definovaný manuálne a kontroluje, či má nastavená hodnota zmysel. Alebo možno ešte obyčajne nie je definovaný žiadny nastavovač. Ostatné metódy vo funkcii triedy nastavili premennú inštancie za getterom iným spôsobom.
Teraz môžeme pridať znak Vek a správne implementovať a názov atribút. Vek Atribút je možné nastaviť v konštruktorovej metóde, prečítať pomocou Vek getter, ale manipulovať iba pomocou have_birthday metóda, ktorá zvýši vek. názov Atribút má normálny getter, ale nastavovateľ sa uistí, že meno je veľké a je vo forme Meno Priezvisko.