Paskaties uz jebkuru objektorientēts kods un tas viss vairāk vai mazāk notiek pēc tā paša modeļa. Izveidojiet objektu, izsauciet dažas metodes šim objektam un piekļūstiet šī objekta atribūtiem. Ar objektu var darīt daudz ko citu, izņemot to kā parametru nodot cita objekta metodei. Bet tas, kas mums šeit rūp, ir atribūti.
Atribūti ir līdzīgi gadījumu mainīgie jūs varat piekļūt, izmantojot objekta punktu apzīmējumu. Piemēram, persona.vārds piekļūtu personas vārdam. Tāpat jūs bieži varat piešķirt tādiem atribūtiem kā person.name = "Alise". Šī ir līdzīga īpašība locekļu mainīgajiem (piemēram, C ++), bet ne gluži tāda pati. Šeit nenotiek nekas īpašs, atribūti lielākajā daļā valodu tiek ieviesti, izmantojot “getters” un “setters” vai metodes, kas izgūst un iestata atribūtus no instanču mainīgajiem.
Rubīns nenošķir atribūtu ieguvējus un noteicējus no parastajām metodēm. Sakarā ar Ruby elastīgo metodi, kas izsauc sintakse, nav jānošķir. Piemēram, persona.vārds un person.name () ir tas pats, jūs zvana
vārds metode ar nulles parametriem. Viens izskatās pēc metodes izsaukuma, bet otrs - kā atribūts, taču tie abi ir viens un tas pats. Viņi abi vienkārši zvana vārds metode. Tāpat uzdevumā var izmantot jebkuru metodes nosaukumu, kas beidzas ar vienādības zīmi (=). Paziņojums person.name = "Alise" ir tiešām tas pats, kas person.vards = (alise), kaut arī starp atribūta nosaukumu un vienādības zīmi ir atstarpe, tas joprojām tikai izsauc nosaukums = metode.Atribūtus var viegli ieviest pats. Definējot setter un getter metodes, jūs varat ieviest jebkuru vēlamo atribūtu. Šeit ir daži koda ieviešanas piemēri vārds atribūts personas klasei. Tas vārdu glabā a @vārds instances mainīgais, bet nosaukumam nav jābūt vienādam. Atcerieties, ka šajās metodēs nav nekā īpaša.
Viena lieta, ko pamanīsit uzreiz, ir tas, ka tas ir daudz darba. Tas ir daudz mašīnrakstīšanas, vienkārši sakot, ka vēlaties atribūtu nosaukts vārds kas piekļūst @vārds instances mainīgais. Par laimi, Rubīns piedāvā dažas ērtības metodes, kas šīs metodes jums definēs.
Ir trīs metodes Modulis klase, kuru varat izmantot klases deklarācijās. Atcerieties, ka Rubīns nenošķir izpildlaiku un "apkopo laiku", un jebkurš kods klases deklarācijās var ne tikai noteikt metodes, bet arī izsaukt metodes. Zvana attr_reader, attr_writer un attr_accessor metodes, savukārt, definēs setterus un getterus, kurus mēs paši definējām iepriekšējā sadaļā.
attr_reader metode ir tieši tāda, kāda tā izklausās. Tas prasa jebkuru simbolu parametru skaitu un katram parametram definē "ieguvēja" metodi, kas atdod tāda paša nosaukuma gadījuma mainīgo. Tātad, mēs varam aizstāt mūsu vārds metode iepriekšējā piemērā ar attr_reader: vārds.
Līdzīgi attr_writer metode definē "iestatītāja" metodi katram simbolam, kas tam nodots. Ņemiet vērā, ka vienādības zīmei nav jābūt simbola daļai, tikai atribūta nosaukumam. Mēs varam aizstāt nosaukums = metode no iepriekšējā piemēra ar aicinājumu uz attr_writier: vārds.
Un, kā gaidīts, attr_accessor veic abu darbu attr_writer un attr_reader. Ja atribūtam ir nepieciešams gan iestatītājs, gan ieguvējs, tā parasti nav, ka abas metodes tiek izsauktas atsevišķi, tā vietā, lai piezvanītu. attr_accessor. Mēs varētu aizstāt gan vārds un nosaukums = metodes no iepriekšējā piemēra ar vienu zvanu uz attr_accessor: vārds.
Kāpēc jums vajadzētu definēt iestatītājus manuāli? Kāpēc neizmantot attr_ * metodes katru reizi? Tā kā viņi pārkāpj iekapsulēšanu. Iekapsulēšana ir princips, saskaņā ar kuru nevienai ārējai vienībai nevajadzētu būt neierobežotai piekļuvei jūsu iekšējam stāvoklim objekti. Visam vajadzētu piekļūt, izmantojot saskarni, kas neļauj lietotājam sabojāt objekta iekšējo stāvokli. Izmantojot iepriekš minētās metodes, mēs esam iegrauzuši lielu caurumu mūsu iekapsulēšanas sienā un ļāvuši vārdam iestatīt absolūti jebko, pat acīmredzami nederīgus vārdus.
Viena lieta, ko jūs bieži redzēsit, ir tā attr_reader tiks izmantots, lai ātri definētu ieguvēju, bet tiks definēts pielāgots iestatītājs, jo objekta iekšējais stāvoklis bieži vien vēlas būt lasīt tieši no iekšējā stāvokļa. Pēc tam iestatītājs tiek definēts manuāli un veic pārbaudi, lai pārliecinātos, ka iestatītajai vērtībai ir jēga. Vai, iespējams, biežāk neviens seters netiek definēts. Citas klases funkcijas metodes instances mainīgo aiz gettera nosaka citā veidā.
Tagad mēs varam pievienot vecums un pareizi ieviest a vārds atribūts. vecums atribūtu var iestatīt konstruktora metodē, lasīt, izmantojot vecums Getter, bet tikai manipulē, izmantojot ir_dzimšanas diena metode, kas palielinās vecumu. vārds atribūtam ir normāls ieguvējs, bet iestatītājs pārliecinās, vai nosaukums tiek rakstīts ar lielo burtu un ir Vārds Uzvārds.