Forekomstvariabler i Ruby-variabler

Kaffe Med At Sign

H&S Production / Getty Images





Forekomstvariabler begynner med et at-tegn (@) og kan kun refereres innenfor klassemetoder. De skiller seg fra lokale variabler ved at de ikke eksisterer i noen bestemt omfang . I stedet lagres en lignende variabeltabell for hver forekomst av en klasse. Forekomstvariabler lever innenfor en klasseforekomst, så så lenge den forekomsten forblir levende, vil forekomstvariablene også gjøre det.

Forekomstvariabler kan refereres til i hvilken som helst metode i den klassen. Alle metodene i en klasse bruker samme forekomst variabel tabell , i motsetning til lokale variabler der hver metode vil ha en annen variabeltabell. Det er imidlertid mulig å få tilgang til instansvariabler uten først å definere dem. Dette vil ikke gi unntak, men variabelens verdi vil være det null og en advarsel vil bli utstedt hvis du har kjørt Ruby med -i bytte om.



Dette eksemplet viser bruken av instansvariabler. Merk at shebang inneholder -i bryter, som vil skrive ut advarsler hvis de skulle oppstå. Legg også merke til feil bruk utenfor en metode i klasseomfanget. Dette er feil og diskuteres nedenfor.

Hvorfor er @test feil variabel? Dette har å gjøre med omfang og hvordan Ruby implementerer ting. Innenfor en metode refererer forekomstvariabelomfanget til den spesielle forekomsten av den klassen. Imidlertid, i klasseomfanget (inne i klassen, men utenfor alle metoder), er omfanget klasseforekomst omfang. Ruby implementerer klassehierarkiet ved å instansiere Klasse gjenstander, så det er en andre instans på spill her. Den første forekomst er en forekomst av Klasse klasse, og det er her @test vil gå. Den andre instansen er instansieringen av Testklasse , og det er her @verdi vil gå. Dette blir litt forvirrende, men husk å aldri bruke det @forekomstvariabler utenfor metodene. Hvis du trenger lagring for hele klassen, bruk @@klasse_variabler , som kan brukes hvor som helst i klasseomfanget (innenfor eller utenfor metoder) og vil oppføre seg på samme måte.



Tilbehør

Du kan vanligvis ikke få tilgang til instansvariabler fra utsiden av et objekt. For eksempel, i eksemplet ovenfor kan du ikke bare ringe t.verdi eller t.@verdi for å få tilgang til instansvariabelen @verdi . Dette ville bryte reglene for innkapsling . Dette gjelder også forekomster av underordnede klasser, de kan ikke få tilgang til forekomstvariabler som tilhører overordnet klasse selv om de teknisk sett er av samme type. Så, for å gi tilgang til instansvariabler, tilbehør metoder må deklareres.

Følgende eksempel viser hvordan aksessormetoder kan skrives. Vær imidlertid oppmerksom på det Rubin gir en snarvei og at dette eksemplet kun eksisterer for å vise deg hvordan tilgangsmetodene fungerer. Det er generelt ikke vanlig å se tilgangsmetoder skrevet på denne måten med mindre det er nødvendig med en slags ekstra logikk for tilgangsenheten.

Snarveiene gjør ting litt enklere og mer kompakt. Det er tre av disse hjelpemetodene. De må kjøres i klasseomfanget (inne i klassen, men utenfor alle metoder), og vil dynamisk definere metoder omtrent som metodene definert i eksemplet ovenfor. Det er ingen magi som skjer her, og de ser ut som språknøkkelord, men de er egentlig bare dynamisk definerende metoder. Dessuten går disse tilbehørene vanligvis øverst i klassen. Det gir leseren en umiddelbar oversikt over hvilke medlemsvariabler som vil være tilgjengelige utenfor klassen eller for barneklasser.

Det er tre av disse tilbehørsmetodene. De tar hver en liste over symboler som beskriver forekomstvariablene som skal åpnes.



    attr_reader- Definer 'leser'-metoder, for eksempel Navn metoden i eksemplet ovenfor.attr_writer- Definer 'skribent'-metoder som f.eks alder= metoden i eksemplet ovenfor.attr_accessor- Definer både 'leser' og 'skribent' metoder.

Når du skal bruke forekomstvariabler

Nå som du vet hva forekomstvariabler er, når bruker du dem? Forekomstvariabler bør brukes når de representerer tilstanden til objektet. En elevs navn og alder, karakterer osv. De skal ikke brukes til midlertidig lagring, det er det lokale variabler er til for. Imidlertid kan de muligens brukes til midlertidig lagring mellom metodeanrop for flertrinnsberegninger. Men hvis du gjør dette, kan det være lurt å revurdere metodesammensetningen din og gjøre disse variablene til metodeparametere i stedet.