Photo by Jack Anstey on Unsplash

Een overzicht van de uitvoeringscontext van blokken

>
Mehdi Farsi

Follow

Sep 20, 2019 – 3 min read

In dit artikel gaan we de volgende onderwerpen verkennen:

  • scopes en blokken
  • flat scope guard in class/module

Voel je eerst vrij om het artikel Scope Gates in Ruby door te bladeren: Deel II artikel.

Voordat u begint

Ik ben verheugd om ons nieuwste project met u te delen: Leuke weetjes over Ruby – Deel 1

Voel je vrij om het woord te verspreiden en deel deze link! 🙏

Bedankt voor uw tijd!

In Ruby kan een blok toegang krijgen tot outer scope

In dit voorbeeld kunnen we toegang krijgen tot de outer_scope_variable variabele binnen ons blok. Ons blok krijgt toegang tot deze variabele, ook al is de variabele gedeclareerd op een main-level scope. In dit geval zeggen we dat het blok scopes flatteert. Dit is waarom we dit mechanisme gewoonlijk noemen: Flat Scope.

Aan de andere kant creëert het blok een geïsoleerde scope – ook al blijft de waarde van self binnen het blok het main object.

Dus kunnen we geen toegang krijgen tot lokale variabelen die binnen het blok zijn gedefinieerd

Hier kunnen we geen toegang krijgen tot de block_variable vanuit de buitenste scope. Nu we meer bekend zijn met de notie van flat scope in Ruby, laten we eens kijken of deze notie van invloed is op de klasse definitie.

Klasse, module en blok

In Ruby is, wat u gewoonlijk een klasse noemt, achter de schermen een instantie van de Class klasse

Hier maken we de Hello en Greeting klassen op twee verschillende manieren:

  • met behulp van het class sleutelwoord
  • door een instantie van de Class klasse toe te wijzen aan de Greeting constante

Merk op dat we een blok doorgeven aan de Class.new methode. Dit blok zal worden geïnterpreteerd als de inhoud van de klasse. Normaal gesproken kan een klasse geen toegang krijgen tot variabelen die in de outer scope zijn gedefinieerd – omdat het class keyword de waarde van self verandert en een geïsoleerde scope creëert.

Dus, omdat we een blok gebruiken om onze Greeting klasse te maken, zouden we in staat moeten zijn om het flat scope mechanisme te gebruiken. Echt waar?

Hier zien we dat de waarde van self verandert bij gebruik van class of Class.new.

Ook is ons Class#message-blok nog steeds geïsoleerd van het main-object door het gebruik van het def-sleutelwoord. Immers, omdat ons blok wordt uitgevoerd in de context van de methode dan het blok flattens scope binnen dit gegeven object – en niet met een hogere scope als het main object.

Daarom hebben we geen toegang tot outer_variable binnen message.

Maar als we define_method gebruiken om message te definiëren, dan wordt de scope afgevlakt

Hier, omdat define_method(:message) een blok als argument neemt, wordt de scope van dit blok afgevlakt en heeft deze methode toegang tot outer_variable.

Voilà!

Articles

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.