Poglejte katerega koli objektno usmerjena koda in vse bolj ali manj sledi istemu vzorcu. Ustvarite objekt, pokličite nekatere metode tega predmeta in dostopajte do atributov tega predmeta. Z objektom ni veliko drugega, razen če ga kot parameter posredujete metodi drugega predmeta. Ampak tisto, kar nas tukaj zanima, so atributi.
Atributi so podobni primerke spremenljivk lahko dostopate prek zapisov predmetnih točk. Na primer ime osebe bi dostopal do imena osebe. Podobno lahko pogosto dodelite atribute, kot so person.name = "Alica". To je podobno funkcijo članskih spremenljivk (na primer v C ++), vendar ne povsem enako. Tu se ne dogaja nič posebnega, atributi se izvajajo v večini jezikov z uporabo "getters" in "setters" ali metod, ki pridobivajo in nastavljajo atribute iz spremenljivk primerkov.
Ruby ne razlikuje med atributi in setterji ter običajnimi metodami. Zaradi prožne metode Ruby, ki kliče sintakso, ni treba razlikovati. Na primer ime osebe in person.name () so ista stvar, ki jo kličete
ime metoda z ničelnimi parametri. Eden je videti kot klic metode, drugi pa kot atribut, vendar sta v resnici oba ista stvar. Oba samo kličeta ime metoda. Podobno se lahko pri dodelitvi uporabi katero koli ime metode, ki se konča z znakom enakosti (=). Izjava person.name = "Alica" je res ista stvar kot person.name = (alica), čeprav je med imenom atributa in znakom enak prostor, še vedno samo kliče ime = metoda.Atribute lahko sami preprosto implementirate. Z definiranjem metod setterja in getterja lahko implementirate poljuben atribut. Tu je nekaj primerov kode za izvajanje ime atribut za razred osebe. Ime shrani v a @ime na primer spremenljivka, vendar ime ne sme biti isto. Ne pozabite, da pri teh metodah ni nič posebnega.
Ena stvar, ki jo boste opazili takoj, je, da je to veliko dela. Veliko je tipkati samo, če želite reči, da želite atribut z imenom ime ki dostopa do @ime primerek spremenljivka. Na srečo Ruby ponuja nekaj priročnih metod, ki bodo te metode definirale za vas.
Obstajajo tri metode Modul razreda, ki ga lahko uporabljate v deklaracijah razreda. Ne pozabite, da Ruby ne razlikuje med izvajanjem in "časom sestavljanja", vsaka koda znotraj deklaracij razreda pa ne more določiti samo metod, temveč tudi klicne metode. Klicanje attr_reader, attr_writer in attr_accessor metode bodo v nadaljevanju opredelile seterje in pripomočke, ki smo jih definirali v prejšnjem razdelku.
The attr_reader metoda je všeč, kar se sliši, kot da bo. Vzame poljubno število parametrov simbolov in za vsak parameter določi metodo "getter", ki vrne istoimensko spremenljivko primerka. Torej, lahko nadomestimo naše ime metoda v prejšnjem primeru s attr_reader: ime.
Podobno velja tudi za attr_writer metoda za vsak simbol, ki mu je bil dodeljen, definira metodo "setter". Upoštevajte, da znak enakosti ne sme biti del simbola, temveč samo ime atributa. Lahko zamenjamo ime = metoda iz prejšnjega primera s pozivom k attr_writier: ime.
In, kot je bilo pričakovano, attr_accessor opravlja delo obeh attr_writer in attr_reader. Če za atribut potrebujete tudi setter in getter, je običajno, da obeh metod ne pokličete ločeno in namesto tega pokličete attr_accessor. Lahko bi zamenjali oboje the ime in ime = metode iz prejšnjega primera z enim klicem na attr_accessor: ime.
Zakaj bi seterje opredelili ročno? Zakaj ne bi uporabili attr_ * metode vsakič? Ker prekinjajo enkapsulacijo. Kapsulacija je glavna, po kateri države, ki nobena zunanja oseba ne bi smele imeti neomejenega dostopa do notranjega stanja vašega predmeti. Do vsega je treba dostopati z vmesnikom, ki uporabniku preprečuje, da bi poškodoval notranje stanje predmeta. Z zgornjimi metodami smo izvrtali veliko luknjo v naši steni za kapsuliranje in dovolili, da se za ime postavi absolutno karkoli, tudi očitno neveljavna imena.
Ena stvar, ki jo boste pogosto videli, je to attr_reader bo uporabljen za hitro definiranje getterja, vendar bo nastavljen po meri nastavitvenik, saj pogosto želi biti notranje stanje objekta prebrati neposredno iz notranjega stanja. Setter se nato določi ročno in preveri, ali je nastavljena vrednost smiselna. Ali morda bolj pogosto, seter sploh ni definiran. Druge metode v funkciji razreda na nek drug način postavljajo spremenljivko primerka za getter.
Zdaj lahko dodamo starost in pravilno izvajati a ime atribut. The starost atribut lahko nastavite v konstruktorski metodi, preberite z uporabo starost getter, ampak samo z njimi imejte rojstni dan metoda, ki bo povečala starost. The ime atribut ima običajen getter, vendar seter poskrbi, da je ime veliko in veliko Ime priimek.