Instantievariabelen beginnen met een apenstaartje (@) en kunnen alleen binnen klassemethoden worden gebruikt. Ze verschillen van lokale variabelen in zoverre dat ze niet bestaan binnen een bepaald toepassingsgebied. In plaats daarvan wordt een vergelijkbare variabelentabel opgeslagen voor elke instantie van een klasse. Instantievariabelen leven binnen een klasse-instantie, dus zolang die instantie in leven blijft, zullen de instantievariabelen dat ook zijn.
Instantievariabelen kunnen in elke methode van die klasse worden genoemd. Alle methoden van een klasse gebruiken dezelfde instantie variabele tabel, in tegenstelling tot lokale variabelen waarbij elke methode een andere variabelentabel heeft. Het is echter mogelijk om toegang te krijgen tot instantievariabelen zonder ze eerst te definiëren. Dit zal geen uitzondering veroorzaken, maar de waarde van de variabele wel nihil en er wordt een waarschuwing gegeven als je Ruby met de hebt uitgevoerd -w schakelaar.
Dit voorbeeld toont het gebruik van instantievariabelen. Merk op dat de
keet bevat de -w schakelaar, die waarschuwingen zal afdrukken als ze zich voordoen. Let ook op het onjuiste gebruik buiten een methode in het klassenbereik. Dit is onjuist en wordt hieronder besproken.Waarom is de @test variabele onjuist? Dit heeft te maken met de reikwijdte en hoe Ruby dingen implementeert. Binnen een methode verwijst het variabelbereik van de instantie naar de specifieke instantie van die klasse. In het klassenbereik (binnen de klasse, maar buiten alle methoden) is het bereik echter de klasse exemplaar toepassingsgebied. Ruby implementeert de klassenhiërarchie door te instantiëren Klasse objecten, dus er is een tweede aanleg hier spelen. De eerste voorbeeld is een voorbeeld van de Klasse klasse, en dit is waar @test zal gaan. De tweede instantie is de instantiatie van TestClassen dit is waar @waarde zal gaan. Dit wordt een beetje verwarrend, maar vergeet niet om het nooit te gebruiken @instantievariabelen buiten methoden. Gebruik als u opslag op klasniveau nodig heeft @@ class_variables, die overal in de klasse (binnen of buiten methoden) kan worden gebruikt en zich hetzelfde zal gedragen.
Normaal gesproken hebt u geen toegang tot instantievariabelen van buiten een object. In het bovenstaande voorbeeld kunt u bijvoorbeeld niet eenvoudig bellen t.waarde of t. @ waarde om toegang te krijgen tot de instantievariabele @waarde. Dit zou de regels van overtreden inkapseling. Dit is ook van toepassing op instanties van onderliggende klassen, ze hebben geen toegang tot instantievariabelen die tot de bovenliggende klasse behoren, hoewel ze technisch van hetzelfde type zijn. Dus om toegang te geven tot instantievariabelen, accessor methoden moeten worden aangegeven.
Het volgende voorbeeld laat zien hoe accessormethoden kunnen worden geschreven. Houd er echter rekening mee dat Robijn biedt een snelkoppeling en dat dit voorbeeld alleen bestaat om u te laten zien hoe de accessor-methoden werken. Het is over het algemeen niet gebruikelijk om accessor-methoden op deze manier geschreven te zien, tenzij een extra logica nodig is voor de accessor.
De snelkoppelingen maken het een beetje eenvoudiger en compacter. Er zijn drie van deze hulpmethoden. Ze moeten binnen het klassenbereik worden uitgevoerd (binnen de klasse maar buiten alle methoden) en zullen dynamisch methoden definiëren die sterk lijken op de methoden die in het bovenstaande voorbeeld zijn gedefinieerd. Er is hier geen magie aan de hand, en ze zien eruit als taalzoekwoorden, maar het zijn echt gewoon dynamisch bepalende methoden. Ook gaan deze accessors meestal aan de top van de klas. Dat geeft de lezer een direct overzicht van welke lidvariabelen beschikbaar zullen zijn buiten de klas of voor kindklassen.
Er zijn drie van deze accessormethoden. Ze nemen elk een lijst met symbolen die de te benaderen variabelen beschrijven.
- attr_reader - Definieer "lezer" methoden, zoals de naam methode in het bovenstaande voorbeeld.
- attr_writer - Definieer "writer" -methoden zoals de leeftijd = methode in het bovenstaande voorbeeld.
- attr_accessor - Definieer zowel "reader" als "writer" methoden.
Wanneer instantievariabelen gebruiken
Nu je weet welke instantievariabelen zijn, wanneer gebruik je ze? Instantievariabelen moeten worden gebruikt wanneer ze de status van het object vertegenwoordigen. De naam en leeftijd van een student, hun cijfers, etc. Ze moeten niet worden gebruikt voor tijdelijke opslag, daar zijn lokale variabelen voor. Ze kunnen echter mogelijk worden gebruikt voor tijdelijke opslag tussen methodeaanroepen voor meertrapsberekeningen. Als u dit echter doet, wilt u misschien de samenstelling van uw methode heroverwegen en in plaats daarvan deze variabelen in parameterparameters veranderen.