Instanzvariablen in Ruby

Instanzvariablen beginnen mit einem at-Zeichen (@) und können nur innerhalb von Klassenmethoden referenziert werden. Sie unterscheiden sich von lokalen Variablen dadurch, dass sie in keinem bestimmten Bereich existieren Umfang. Stattdessen wird für jede Instanz einer Klasse eine ähnliche Variablentabelle gespeichert. Instanzvariablen befinden sich in einer Klasseninstanz. Solange diese Instanz am Leben bleibt, bleiben auch die Instanzvariablen erhalten.

Instanzvariablen können in jeder Methode dieser Klasse referenziert werden. Alle Methoden einer Klasse verwenden dieselbe Instanz Variablentabelleim Gegensatz zu lokalen Variablen, bei denen jede Methode eine andere Variablentabelle hat. Es ist jedoch möglich, auf Instanzvariablen zuzugreifen, ohne sie 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 ausgeführt haben -w Schalter.

Dieses Beispiel zeigt die Verwendung von Instanzvariablen. Notiere dass der

instagram viewer
shebang enthält die -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 unten diskutiert.

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 Bereich 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. Der Erste Beispiel ist eine Instanz der Klasse Klasse, und hier ist @Prüfung werde gehen. Die zweite Instanz ist die Instanziierung von Testklasseund hier ist @Wert werde gehen. Dies wird etwas verwirrend, aber denken Sie daran, nie zu verwenden @instance_variables außerhalb von Methoden. Wenn Sie klassenweiten Speicher benötigen, verwenden Sie @@ class_variables, die überall im Klassenbereich (innerhalb oder außerhalb von Methoden) verwendet werden können und sich gleich verhalten.

Normalerweise können Sie nicht von außerhalb eines Objekts auf Instanzvariablen zugreifen. Im obigen Beispiel können Sie beispielsweise nicht einfach anrufen t.Wert 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 selben Typ sind. Um den Zugriff auf Instanzvariablen zu ermöglichen, Accessor Methoden müssen deklariert werden.

Das folgende Beispiel zeigt, wie Accessor-Methoden geschrieben werden können. Beachten Sie jedoch, dass Rubin bietet eine Verknüpfung und dieses Beispiel zeigt nur, wie die Accessor-Methoden funktionieren. 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 etwas einfacher und kompakter. Es gibt drei dieser Hilfsmethoden. Sie müssen im Klassenbereich ausgeführt werden (innerhalb der Klasse, jedoch außerhalb von Methoden) und definieren Methoden dynamisch, ähnlich wie die im obigen Beispiel definierten Methoden. Hier ist keine Magie im Gange und sie sehen aus wie Sprachschlüsselwörter, aber sie definieren wirklich nur dynamisch Methoden. Außerdem stehen diese Accessoren normalerweise an der Spitze der Klasse. Dies gibt dem Leser einen sofortigen Überblick darüber, welche Mitgliedsvariablen 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.

  • attr_reader - Definieren Sie "Reader" -Methoden wie die Name Methode im obigen Beispiel.
  • attr_writer - Definieren Sie "Writer" -Methoden wie die Alter = Methode im obigen Beispiel.
  • attr_accessor - Definieren Sie sowohl "Leser" - als auch "Schreiber" -Methoden.

Wann werden Instanzvariablen verwendet?

Nachdem Sie nun wissen, was Instanzvariablen sind, wann verwenden Sie sie? Instanzvariablen sollten verwendet werden, wenn sie den Status des Objekts darstellen. Name und Alter eines Schülers, seine Noten usw. Sie sollten nicht für die temporäre Speicherung verwendet werden, dafür sind lokale Variablen gedacht. Sie könnten jedoch möglicherweise zur temporären 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 in Methodenparameter umwandeln.