Foto von Jack Anstey auf Unsplash

Ein Überblick über den Ausführungskontext von Blöcken

Mehdi Farsi

Follow

Sep 20, 2019 – 3 min read

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 Konstante Greeting

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à!

Articles

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.