Ein Überblick über den Ausführungskontext von Blöcken
In diesem Artikel werden wir uns mit den folgenden Themen beschäftigen:
- Scopes und Blöcke
- Flat Scope Guard in Class/Module
Zuerst können Sie sich den Artikel Scope Gates in Ruby ansehen: Teil II
Bevor es losgeht
Ich freue mich, Ihnen unser neuestes Projekt vorzustellen: Wissenswertes über Ruby – Teil 1
Bitte verbreiten Sie es weiter und teilen Sie diesen Link! 🙏
Danke für deine Zeit!
In Ruby kann ein Block auf äußere Bereiche zugreifen
In diesem Beispiel können wir innerhalb unseres Blocks auf die Variable outer_scope_variable
zugreifen. Unser Block kann auf diese Variable zugreifen, obwohl die Variable auf der Ebene main
deklariert ist. In diesem Fall sagen wir, dass der Block die Geltungsbereiche abflacht. Aus diesem Grund nennen wir diesen Mechanismus üblicherweise: Flat Scope.
Auf der anderen Seite schafft der Block einen isolierten Scope – auch wenn der Wert von self
innerhalb des Blocks das main
-Objekt bleibt.
So können wir nicht auf lokale Variablen zugreifen, die innerhalb des Blocks definiert sind
Hier können wir nicht auf das block_variable
aus dem äußeren Scope zugreifen. Da wir nun mit dem Begriff des flachen Bereichs in Ruby vertrauter sind, wollen wir sehen, ob dieser Begriff Auswirkungen auf die Klassendefinition hat.
Klasse, Modul und Block
In Ruby ist das, was man gemeinhin als Klasse bezeichnet, hinter der Bühne eine Instanz der Klasse Class
Hier erstellen wir die Klassen Hello
und Greeting
auf zwei verschiedene Arten:
- mit dem Schlüsselwort
class
- durch Zuweisung einer Instanz der Klasse
Class
an die KonstanteGreeting
Beachten Sie, dass wir einen Block an die Methode Class.new
übergeben. Dieser Block wird als der Inhalt der Klasse interpretiert. Normalerweise kann eine Klasse nicht auf Variablen zugreifen, die im äußeren Bereich definiert sind – da das Schlüsselwort class
den Wert von self
ändert und einen isolierten Bereich schafft.
Da wir also einen Block verwenden, um unsere Greeting
Klasse zu erstellen, sollten wir in der Lage sein, den flachen Bereichsmechanismus zu nutzen. Wirklich?
Hier sehen wir, dass sich der Wert von self
ändert, wenn wir class
oder Class.new
verwenden.
Außerdem ist unser Class#message
-Block aufgrund der Verwendung des Schlüsselworts def
immer noch vom main
-Objekt isoliert. Da unser Block nämlich im Kontext der Methode ausgeführt wird, flacht der Block den Geltungsbereich innerhalb dieses gegebenen Objekts ab – und nicht mit einem höheren Geltungsbereich wie dem main
-Objekt.
Deshalb haben wir keinen Zugriff auf outer_variable
innerhalb von message
.
Wenn wir aber define_method
verwenden, um message
zu definieren, dann wird der Geltungsbereich abgeflacht
Hier, da define_method(:message)
einen Block als Argument nimmt, wird der Geltungsbereich dieses Blocks abgeflacht und diese Methode hat Zugriff auf outer_variable
.
Voilà!