Een overzicht van de uitvoeringscontext van blokken
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 deGreeting
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à!