Pogledajte bilo kojeg objektno orijentirani kod i sve to manje-više slijedi isti obrazac. Napravite objekt, nazovite neke metode tog objekta i pristupite atributima tog objekta. Ne možete puno drugo učiniti s objektom, osim što ga proslijedite kao parametar metodi drugog objekta. Ali ono što nas ovdje zanima jesu atributi.
Atributi su kao varijable instance možete pristupiti putem objektne bilješke. Na primjer, person.name pristupio bi imenu neke osobe. Slično tome, često možete dodijeliti atribute poput person.name = "Alica". To je slična značajka članskim varijablama (kao što je C ++), ali nije sasvim isto. Ovdje se ne događa ništa posebno, atributi se implementiraju na većini jezika koristeći "getters" i "setters" ili metode koje dohvaćaju i postavljaju atribute iz varijabli instanci.
Ruby ne pravi razliku između atributa i settera i normalnih metoda. Zbog Rubyjeve fleksibilne metode koja zove sintaksu, ne treba praviti razliku. Na primjer, person.name i person.name () su ista stvar, vi zovete
Ime metoda s nultim parametrima. Jedan izgleda kao poziv metode, a drugi izgleda kao atribut, ali zaista su oboje ista stvar. Oboje samo zovu Ime metoda. Slično se u dodjeli može koristiti bilo koje ime metode koja završava znakom jednake vrijednosti (=). Izjava person.name = "Alica" stvarno je ista stvar kao person.name = (Alice), iako postoji prostor između imena atributa i znaka jednake, on još uvijek samo zove name = metoda.Atribute možete jednostavno implementirati sami. Definiranjem metoda setera i gettera možete implementirati bilo koji atribut koji želite. Evo nekoliko primjera koda za implementaciju Ime atribut za klasu osobe. To ime pohranjuje u @Ime varijabla instance, ali ime ne mora biti isto. Imajte na umu da u tim metodama nema ništa posebno.
Jedna stvar koju ćete odmah primijetiti je da je to puno posla. Puno je tipkati samo da biste rekli da želite atribut po imenu Ime koja pristupa @Ime varijabla instance. Srećom, Ruby nudi neke praktične metode koje će definirati te metode za vas.
U sustavu postoje tri metode Modul klase koju možete koristiti unutar deklaracije svoje klase. Zapamtite da Ruby ne pravi razliku između vremena izvršavanja i "vremena sastavljanja", a bilo koji kôd unutar deklaracije klase ne može definirati samo metode, već i pozivne metode. Pozivanje attr_reader, attr_writer i attr_accessor metode će zauzvrat definirati setore i gettere koje smo sami definirali u prethodnom odjeljku.
attr_reader metoda se sviđa baš onome što zvuči kao da će se dogoditi. Potrebno je uzeti bilo koji broj parametara simbola i za svaki parametar definira metodu "getter" koja vraća istoimenu varijablu varijable. Dakle, možemo zamijeniti naše Ime metoda u prethodnom primjeru sa attr_reader: ime.
Slično tome attr_writer metoda definira metodu "setter" za svaki simbol prosljeđen njemu. Imajte na umu da znak jednakosti ne mora biti dio simbola, već samo naziv atributa. Možemo zamijeniti name = metoda iz prethodnog primjera s pozivom na attr_writier: ime.
I, kao što se očekivalo, attr_accessor radi posao obojice attr_writer i attr_reader. Ako su vam i atribut potrebni i setter i getter, uobičajena je praksa da se dvije metode ne pozivaju odvojeno, već umjesto toga nazovite attr_accessor. Mogli bismo zamijeniti oba Ime i name = metode iz prethodnog primjera jednim pozivom na attr_accessor: ime.
Zašto biste ručno definirali programere? Zašto ne biste koristili attr_ * metode svaki put? Jer razbijaju enkapsulaciju. Inkapsulacija je glavna stvar koja navodi da niti jedan vanjski entitet ne bi trebao imati neograničen pristup vašem unutarnjem stanju objekti. Svemu treba pristupiti pomoću sučelja koje sprečava korisnika da ošteti unutarnje stanje objekta. Korištenjem gore navedenih metoda, probušili smo veliku rupu u našem zidu za kapsulu i omogućili smo da se za ime postavi apsolutno sve, čak i očito nevaljana imena.
Jedno što ćete često vidjeti je to attr_reader koristit će se za brzo definiranje gettera, ali bit će definiran prilagođeni setter s obzirom da unutarnje stanje objekta često želi biti čitati izravno iz unutarnjeg stanja. Setter se zatim definira ručno i provjerava da li vrijednost koja se postavlja ima smisla. Ili, možda češće, nijedan seter uopće nije definiran. Druge metode u funkciji klase postavljaju varijablu instance iza gettera na neki drugi način.
Sada možemo dodati an dob i pravilno implementirati a Ime atribut. dob atribut može se postaviti u konstruktorskoj metodi, očitano pomoću dob getter, ali samo manipulira pomoću have_birthday metoda koja će povećavati starost. Ime atribut ima normalan getter, ali seter postara da se naziv upiše s velikim slovom i ima oblik Ime prezime.