Instansvariabler i Ruby

Instansvariabler börjar med ett at-tecken (@) och kan endast refereras inom klassmetoder. De skiljer sig från lokala variabler genom att de inte finns inom någon speciell omfattning. Istället lagras en liknande variabeltabell för varje instans av en klass. Instansvariabler lever i en klassinstans, så länge den instansen förblir levande, så kommer instansvariablerna att göra.

Instansvariabler kan hänvisas till i alla metoder i den klassen. Alla metoder i en klass använder samma instans variabel tabell, i motsats till lokala variabler där varje metod har en annan variabeltabell. Det är dock möjligt att komma åt instansvariabler utan att först definiera dem. Detta kommer inte att göra ett undantag, men variabelns värde kommer att vara noll och en varning kommer att ges om du har kört Ruby med -w växla.

Detta exempel visar användningen av instansvariabler. Observera att shebang innehåller -w switch, som kommer att skriva ut varningar om de skulle inträffa. Observera också felaktig användning utanför en metod i klassomfånget. Detta är felaktigt och diskuteras nedan.

instagram viewer

Varför är @testa variabel felaktig? Detta har att göra med omfattning och hur Ruby implementerar saker. Inom en metod hänvisar instansvariabeln till den specifika instansen för den klassen. Men inom klassomfånget (inuti klassen, men utanför några metoder) är omfattningen den klassinstans omfattning. Ruby implementerar klasshierarkin genom att instansera Klass föremål, så det finns en andra instans på spel här. Den första exempel är ett exempel på Klass klass, och det är här @testa kommer att gå. Den andra instansen är inställningen av TestClass, och det är här @värde kommer att gå. Detta blir lite förvirrande, men kom bara ihåg att aldrig använda det @instance_variables utanför metoder. Om du behöver lagring i hela klass använder du det @@ class_variables, som kan användas var som helst i klassomfånget (inom eller utanför metoder) och kommer att uppträda på samma sätt.

Du kan normalt inte få åtkomst till instansvariabler utanför ett objekt. I exemplet ovan kan du till exempel inte bara ringa t.value eller t. @ värde för att komma åt instansvariabeln @värde. Detta skulle bryta reglerna för inkapsling. Detta gäller även för instanser av barnklasser, de kan inte få tillgång till instansvariabler som tillhör föräldraklassen trots att de är tekniskt av samma typ. Så för att ge tillgång till instansvariabler, accessor metoder måste deklareras.

Följande exempel visar hur accessor-metoder kan skrivas. Observera dock att Rubin tillhandahåller en genväg och att detta exempel bara finns för att visa hur tillbehörsmetoderna fungerar. Det är vanligtvis inte vanligt att se accessormetoder skrivna på detta sätt såvida det inte behövs någon form av ytterligare logik för accessorn.

Genvägarna gör saker och ting enklare och mer kompakta. Det finns tre av dessa hjälpmetoder. De måste köras inom klassomfånget (inuti klassen men utanför några metoder) och kommer dynamiskt att definiera metoder ungefär som de metoder som definieras i exemplet ovan. Det här finns ingen magi här, och de ser ut som språkord, men de är egentligen bara dynamiskt definierande metoder. Dessutom går dessa accessorer vanligtvis högst upp i klassen. Det ger läsaren en omedelbar översikt över vilka medlemsvariabler som kommer att finnas tillgängliga utanför klassen eller för barnklasser.

Det finns tre av dessa accessormetoder. De tar var och en en lista med symboler som beskriver instansvariabler som ska nås.

  • attr_reader - Definiera "läsar" -metoder, t.ex. namn i ovanstående exempel.
  • attr_writer - Definiera "författare" -metoder som ålders = i ovanstående exempel.
  • attr_accessor - Definiera både "läsare" och "författare" -metoder.

När man ska använda instansvariabler

Nu när du vet vilka instansvariabler är, när använder du dem? Instansvariabler bör användas när de representerar objektets tillstånd. En students namn och ålder, deras betyg etc. De bör inte användas för tillfällig lagring, det är vad lokala variabler är för. De kan emellertid eventuellt användas för tillfällig lagring mellan metodsamtal för flerstegsberäkningar. Men om du gör det, kan du kanske tänka om din metodsammansättning och göra dessa variabler till metodparametrar istället.

instagram story viewer