Määritteiden käyttö Ruby-koodilla

click fraud protection

Katso mitä tahansa olio-ohjeinen koodi ja kaikki noudattaa enemmän tai vähemmän samaa mallia. Luo objekti, soita joihinkin menetelmiin objektissa ja päästä kyseisen objektin määritteisiin. Objektilla ei voi tehdä paljon muuta kuin siirtää se parametrina toisen objektin menetelmälle. Mutta mitä meitä huolestuttaa, ovat ominaisuudet.

Attribuutit ovat kuin esiintymämuuttujat pääset käsiksi objektin pistemerkinnän avulla. Esimerkiksi, person.name pääsisi henkilön nimeen. Samoin voit usein määrittää attribuutteja kuten person.name = "Alice". Tämä on samanlainen ominaisuus jäsenmuuttujiin (kuten C ++: ssa), mutta ei aivan sama. Täällä ei ole mitään erityistä, attribuutit toteutetaan useimmissa kielissä käyttämällä "getters" - ja "setters" -menetelmiä tai menetelmiä, jotka noutavat ja asettavat attribuutit ilmentymän muuttujista.

Ruby ei tee eroa ominaisuuksien hankkijoiden ja asettajien välillä ja normaalien menetelmien välillä. Koska Ruby on joustava menetelmä, joka kutsuu syntaksia, eroja ei tarvitse tehdä. Esimerkiksi,

instagram viewer
person.name ja person.name () ovat sama asia, soitat nimi menetelmä, jolla ei ole parametreja. Yksi näyttää menetelmäkutsu ja toinen näyttää määritteeltä, mutta ne ovat todellakin molemmat sama asia. He molemmat vain soittavat nimi menetelmä. Vastaavasti mitä tahansa menetelmän nimeä, joka päättyy yhtälömerkille (=), voidaan käyttää tehtävässä. Lausunto person.name = "Alice" on oikeastaan ​​sama asia kuin person.name = (Alice), vaikka ominaisuuden nimen ja yhtäläisyysmerkin välillä on välilyönti, se silti vain soittaa name = menetelmä.

Voit määrittää ominaisuudet helposti itse. Määrittelemällä setter- ja getter -menetelmät voit toteuttaa minkä tahansa haluamasi ominaisuuden. Tässä on esimerkki koodista nimi attribuutti henkilöluokalle. Se tallentaa nimen @nimi esiintymämuuttuja, mutta nimen ei tarvitse olla sama. Muista, että näissä menetelmissä ei ole mitään erityistä.

Yksi asia, jonka huomaat heti, on, että tämä on paljon työtä. On paljon kirjoittamista vain sanoa, että haluat määritteen nimeltä nimi joka käyttää @nimi esiintymismuuttuja. Onneksi Ruby tarjoaa joitain mukavuusmenetelmiä, jotka määrittelevät nämä menetelmät sinulle.

Tässä on kolme menetelmää Moduuli luokka, jota voit käyttää luokka-ilmoituksissa. Muista, että Ruby ei tee eroa suorituksen ja "koota ajan" välillä, ja luokka-ilmoitusten sisällä oleva koodi ei voi vain määritellä menetelmiä, vaan kutsua myös menetelmiä. Soittaminen attr_reader, attr_writer ja attr_accessor menetelmät puolestaan ​​määrittelevät asettajat ja getterit, jotka määrittelimme itsemme edellisessä osassa.

attr_reader menetelmä toimii juuri niin kuin miltä se kuulostaa. Se vie minkä tahansa määrän symboliparametreja ja määrittää jokaiselle parametrille "getter" -menetelmän, joka palauttaa saman nimen esiintymätunnuksen. Joten voimme korvata meidän nimi menetelmä edellisessä esimerkissä attr_reader: nimi.

Samoin attr_writer menetelmä määrittelee "setter" -menetelmän jokaiselle sille siirretylle symbolille. Huomaa, että yhtäläisyysmerkin ei tarvitse olla osa symbolia, vaan vain määritteen nimi. Voimme korvata name = menetelmä edellisestä esimerkistä kutsulla attr_writier: nimi.

Ja kuten odotettiin, attr_accessor tekee molempien työtä attr_writer ja attr_reader. Jos tarvitset sekä setter- että getter -määritteitä attribuutille, on yleistä, että et soita näitä kahta menetelmää erikseen, vaan soita sen sijaan attr_accessor. Voisimme korvata molemmat nimi ja name = menetelmät edellisestä esimerkistä yhdellä puhelulla attr_accessor: nimi.

Miksi sinun tulisi määrittää asettajat manuaalisesti? Miksi et käytä attr_ * menetelmiä joka kerta? Koska ne rikkovat kapseloinnin. Kapselointi on periaate, jonka mukaan millään ulkopuolisella yksiköllä ei tulisi olla rajoittamatonta pääsyä sisäiseen tilaan esineet. Kaikelle tulisi päästä käyttöliittymällä, joka estää käyttäjää vahingoittamasta objektin sisäistä tilaa. Yllä olevien menetelmien avulla olemme lyöneet suuren reiän kotelointiseinämäämme ja sallineet nimelle asettaa ehdottoman kaiken, jopa ilmeisesti virheelliset nimet.

Yksi asia, jonka usein näet, on se attr_reader käytetään määrittelemään nopeasti noutaja, mutta mukautettu asettaja määritetään, koska objektin sisäinen tila usein haluaa olla lukea suoraan sisäisestä tilasta. Sitten setteri määritetään manuaalisesti ja tarkistaa varmistaakseen, että asetettava arvo on järkevä. Tai kenties yleisemmin, mitään asettajaa ei määritetä ollenkaan. Luokkatoiminnon muut menetelmät asettavat esiintymämuuttujan getterin taakse jollain muulla tavalla.

Voimme nyt lisätä ikä ja toteuta a nimi määrite. ikä attribuutti voidaan asettaa rakentajamenetelmällä, lukea ikä getter mutta manipuloidaan vain have_birthday menetelmä, joka kasvattaa ikää. nimi -määritteellä on normaali hakutoiminto, mutta asettaja varmistaa, että nimi kirjoitetaan isoilla kirjaimilla ja muodossa Etunimi Sukunimi.

instagram story viewer