Instanzvariablen beginnen mit einem at-Zeichen (@) und können nur innerhalb von Klassenmethoden referenziert werden. Sie unterscheiden sich von lokalen Variablen darin, dass sie in keinem bestimmten Bereich existieren. Stattdessen wird für jede Instanz einer Klasse eine ähnliche Variablentabelle gespeichert. Instanzvariablen befinden sich in einer Klasseninstanz. Solange diese Instanz aktiv bleibt, sind es auch die Instanzvariablen.
Instanzvariablen können in jeder Methode dieser Klasse referenziert werden. Alle Methoden einer Klasse verwenden dieselbe Instanzvariablentabelle im Gegensatz zu lokalen Variablen, bei denen jede Methode eine andere Variablentabelle hat. Es ist jedoch möglich, auf Instanzvariablen zuzugreifen, ohne diese zuvor zu definieren. Dies löst keine Ausnahme aus, aber der Wert der Variablen ist Null und eine Warnung wird ausgegeben, wenn Sie Ruby mit dem ausführen -w Schalter.
Dieses Beispiel zeigt die Verwendung von Instanzvariablen. Beachten Sie, dass der Shebang die enthält -w Schalter, der Warnungen ausgibt, falls sie auftreten. Beachten Sie auch die falsche Verwendung außerhalb einer Methode im Klassenbereich. Dies ist falsch und wird weiter unten erläutert.
Warum ist der @Prüfung Variable falsch? Dies hat mit dem Umfang und der Implementierung von Ruby zu tun. Innerhalb einer Methode bezieht sich der Gültigkeitsbereich der Instanzvariablen auf die bestimmte Instanz dieser Klasse. Im Klassenbereich (innerhalb der Klasse, aber außerhalb von Methoden) ist der Bereich jedoch der Klasseninstanz Umfang. Ruby implementiert die Klassenhierarchie durch Instanziieren Klasse Objekte, so gibt es eine zweite Instanz hier spielen. Die erste Instanz ist eine Instanz von Klasse Klasse, und das ist, wo @Prüfung werde gehen. Die zweite Instanz ist die Instanziierung von TestClass, und das ist wo @Wert werde gehen. Dies wird ein bisschen verwirrend, aber denken Sie daran, nie zu verwenden @instance_variables außerhalb der Methoden. Wenn Sie klassenweiten Speicher benötigen, verwenden Sie @@ Klassenvariablen, Diese Methode kann an einer beliebigen Stelle im Klassenbereich (innerhalb oder außerhalb von Methoden) verwendet werden und verhält sich gleich.
Normalerweise können Sie nicht von außerhalb eines Objekts auf Instanzvariablen zugreifen. Im obigen Beispiel können Sie beispielsweise nicht einfach anrufen t.value oder t. @ Wert um auf die Instanzvariable zuzugreifen @Wert. Dies würde die Regeln von brechen Verkapselung. Dies gilt auch für Instanzen von untergeordneten Klassen. Sie können nicht auf Instanzvariablen zugreifen, die zur übergeordneten Klasse gehören, obwohl sie technisch vom gleichen Typ sind. Also, um den Zugriff auf Instanzvariablen zu ermöglichen, Accessor Methoden müssen deklariert werden.
Das folgende Beispiel zeigt, wie Accessormethoden geschrieben werden können. Beachten Sie jedoch, dass Ruby eine Verknüpfung bereitstellt und dieses Beispiel nur zur Veranschaulichung der Funktionsweise der Zugriffsmethoden dient. Es ist im Allgemeinen nicht üblich, auf diese Weise geschriebene Accessormethoden zu sehen, es sei denn, für den Accessor ist eine zusätzliche Logik erforderlich.
Die Verknüpfungen machen die Dinge ein bisschen einfacher und kompakter. Es gibt drei dieser Hilfsmethoden. Sie müssen im Klassenbereich (innerhalb der Klasse, aber außerhalb von Methoden) ausgeführt werden und definieren Methoden ähnlich wie die im obigen Beispiel definierten Methoden dynamisch. Hier ist keine Zauberei los und sie sehen aus wie Sprachschlüsselwörter, aber sie definieren wirklich nur dynamisch Methoden. Außerdem stehen diese Accessoren in der Regel an der Spitze der Klasse. Dies gibt dem Leser einen sofortigen Überblick darüber, welche Elementvariablen außerhalb der Klasse oder für untergeordnete Klassen verfügbar sind.
Es gibt drei dieser Zugriffsmethoden. Sie enthalten jeweils eine Liste von Symbolen, die die Instanzvariablen beschreiben, auf die zugegriffen werden soll.
Wenn Sie wissen, was Instanzvariablen sind, wann verwenden Sie sie? Instanzvariablen sollten verwendet werden, wenn sie den Status des Objekts darstellen. Der Name und das Alter eines Schülers, seine Noten usw. Sie sollten nicht für die vorübergehende Speicherung verwendet werden, dafür sind lokale Variablen vorgesehen. Sie können jedoch möglicherweise für die temporäre Speicherung zwischen Methodenaufrufen für mehrstufige Berechnungen verwendet werden. Wenn Sie dies jedoch tun, möchten Sie möglicherweise Ihre Methodenzusammensetzung überdenken und diese Variablen stattdessen zu Methodenparametern machen.