In diesem Artikel werden wir uns mit den folgenden Themen beschäftigen:
- Methodenumfang
- Klassenumfang
Vor dem Start
Ich freue mich sehr, Ihnen unser neuestes Projekt vorzustellen: Wissenswertes über Ruby – Band 1
Bitte verbreiten Sie diesen Beitrag und teilen Sie ihn! 🙏
Danke für deine Zeit!
In Ruby ist der Umfang eines Programms stark mit dem Wert von self
korreliert.
Hier werden wir detailliert beschreiben, welche Werte self
hat, wenn wir uns in einer Methode, einer Klasse und im Top-Level-Bereich befinden.
Methodenbereich
In Ruby ist der Top-Level-Bereich der Kontext des main
-Objekts.
In diesem Moment bezieht sich self
auf das main
-Objekt.
Lesen Sie ruhig den Artikel Ruby Object Model, wenn Sie das
main
-Objekt nicht kennen.
Was ist nun der Kontext von self
innerhalb einer Methode, die im Top-Level-Bereich definiert ist?
Hier sehen wir, dass sich self
auch auf das main
-Objekt bezieht.
Der einzige Unterschied ist, dass wir innerhalb unserer Methode keinen Zugriff auf lokale Variablen haben, die im Top-Level-Bereich deklariert sind.
Das liegt daran, dass das def
-Schlüsselwort den Inhalt der Methode in einen völlig isolierten Bereich einbettet.
Dagegen kann unsere Methode auf Instanzvariablen zugreifen, die im Top-Level-Bereich deklariert sind.
Da Instanzvariablen auf Objektebene deklariert werden, können wir auf diese Variablen in einem anderen Bereich zugreifen, in dem self
auf dasselbe Objekt verweist – in unserem Fall auf das Objekt main
.
Da self
also sowohl im Top-Level-Bereich als auch in der im Top-Level-Bereich definierten Methode auf main
verweist, können wir in der Methode hello
auf die Instanzvariable @instance_variable
zugreifen.
Klassenbereich
Wenn wir das Schlüsselwort class
verwenden:
- Der Wert von
self
ändert sich - Der Inhalt der Klasse wird in einen isolierten Bereich eingebettet
Schauen wir uns das folgende Beispiel an
Hier sehen wir, dass in unserer Klasse self
einen anderen Wert hat – er bezieht sich auf die Klasse Hello
.
Auch haben wir keinen Zugriff auf Variablen und Methoden, die außerhalb der Klasse definiert sind.
Beachten Sie, dass wir aus denselben Gründen, die im ersten Teil des Artikels beschrieben wurden, Zugriff auf Instanzvariablen in Instanzmethoden haben.
Im Teil II & III werden wir mit Geltungsbereichen spielen, indem wir Module, verschachtelte Klassen und Blöcke (FLAT SCOPES) verwenden.
Voilà !