Forekomstvariabler begynner med et at-tegn (@) og kan bare henvises innen klassemetoder. De skiller seg fra lokale variabler ved at de ikke eksisterer innenfor noen bestemt omfang. I stedet lagres en lignende variabeltabel for hver forekomst av en klasse. Forekomstvariabler lever i en klasseinstans, så lenge forekomsten holder seg i live, vil også forekomstvariablene.
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 variabeltabel. Det er imidlertid mulig å få tilgang til forekomstvariabler uten å definere dem først. Dette vil ikke heve et unntak, men variabelens verdi vil være nil og det vil bli gitt en advarsel hvis du har kjørt Ruby med -w bytte om.
Dette eksemplet viser bruken av forekomstvariabler. Merk at shebang inneholder -w bryter, som vil skrive ut advarsler hvis de skulle oppstå. Legg også merke til feil bruk utenfor en metode i klassens omfang. Dette er feil og diskutert nedenfor.
Hvorfor er @test variabel feil? Dette har med omfanget å gjøre og hvordan Ruby implementerer ting. Innenfor en metode refererer forekomstvariabelt omfang til den spesielle forekomsten av den klassen. Imidlertid, i klassens omfang (inne i klassen, men utenfor noen metoder), er omfanget imidlertid klasseinstans omfang. Ruby implementerer klassehierarkiet ved å instantisere Klasse gjenstander, så det er en andre instans på spill her. Den første forekomst er et eksempel på Klasse klasse, og det er her @test vil gå. Den andre forekomsten er oppstart av TestClass, og det er her @verdi vil gå. Dette blir litt forvirrende, men husk bare å aldri bruke @instance_variables utenom metoder. Hvis du trenger lagringsplass over hele klassen, bruk @@ class_variables, som kan brukes hvor som helst i klassens omfang (innenfor eller utenfor metoder) og vil oppføre seg det samme.
Du har normalt ikke tilgang til forekomstvariabler fra utsiden av et objekt. I eksempelet ovenfor kan du for eksempel ikke bare ringe t.value eller t. @ verdien for å få tilgang til forekomstvariabelen @verdi. Dette ville bryte reglene for innkapsling. Dette gjelder også forekomster av barneklasser, de kan ikke få tilgang til forekomstvariabler som tilhører foreldreklassen, selv om de teknisk sett er av samme type. Så for å gi tilgang til forekomstvariabler, tilbehør metoder må deklareres.
Følgende eksempel viser hvordan tilgangsmetoder kan skrives. Vær imidlertid oppmerksom på at Rubin gir en snarvei og at dette eksemplet bare eksisterer for å vise deg hvordan tilgangsmetodene fungerer. Det er vanligvis ikke vanlig å se accessor-metoder skrevet på denne måten med mindre det er nødvendig med en slags tilleggslogikk for accessoren.
Snarveiene gjør ting litt enklere og mer kompakte. Det er tre av disse hjelpemetodene. De må kjøres i klassens omfang (inne i klassen, men utenfor noen metoder), og vil dynamisk definere metoder omtrent som metodene som er definert i eksemplet ovenfor. Det er ingen magi som skjer her, og de ser ut som språklige nøkkelord, men de er egentlig bare dynamisk definerende metoder. Også disse tilbehørene går vanligvis øverst i klassen. Det gir leseren en øyeblikkelig oversikt over hvilke medlemsvariabler som vil være tilgjengelige utenfor klassen eller for barneklasser.
Det er tre av disse aksessor-metodene. 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 "forfatter" -metoder som alder = metoden i eksemplet ovenfor.
- attr_accessor - Definer både "leser" og "forfatter" metoder.
Når skal jeg bruke forekomstvariabler
Når du vet hva forekomstvariabler er, når bruker du dem? Forekomstvariabler bør brukes når de representerer objektets tilstand. 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 flerstegsberegninger. Men hvis du gjør dette, kan det være lurt å revurdere metodesammensetningen og gjøre disse variablene til metodeparametere i stedet.