In dit artikel gaan we in op de volgende onderwerpen:
- method scope
- class scope
Voordat we beginnen
Ik ben verheugd om ons nieuwste project met jullie te delen: Leuke weetjes over Ruby – Deel 1
Gelieve je vrij te voelen om het woord te verspreiden en deze post te delen! Dank u voor uw tijd!
In Ruby is de scope van een programma sterk gecorreleerd aan de waarde van self
.
Hier gaan we in detail bekijken wat de waarden van self
zijn als we in een methode, een klasse en in de top-level scope zijn.
Method scope
In Ruby is de top-level scope de context van het main
object.
Op dit moment verwijst self
naar het main
object.
Voel je vrij om het Ruby Object Model artikel te lezen als je niet bekend bent met het
main
object.
Nu, wat is de context van self
binnen een methode die is gedefinieerd in het top-level bereik?
Hier kunnen we zien dat self
ook verwijst naar het main
object.
Het enige verschil is dat we geen toegang hebben tot lokale variabelen die zijn gedeclareerd in het top-level bereik binnen onze methode.
Dit is te wijten aan het feit dat het def
sleutelwoord de inhoud van de methode in een volledig geïsoleerd bereik insluit.
Hoewel, onze methode heeft toegang tot instantievariabelen die in het top-level bereik zijn gedeclareerd.
Inderdaad, omdat instance-variabelen worden gedeclareerd op objectniveau, kunnen we toegang krijgen tot deze variabelen in een ander bereik waar self
verwijst naar hetzelfde object – het main
-object in ons geval.
Dus, aangezien self
verwijst naar main
in zowel het top-level bereik als in de methode die is gedefinieerd in het top-level bereik, kunnen we toegang krijgen tot de @instance_variable
-instance-variabele in de hello
-methode.
Class scope
Wanneer we het class
sleutelwoord gebruiken:
- De waarde van
self
verandert - De inhoud van de klasse wordt ingebed in een geïsoleerde scope
Laten we eens kijken naar het volgende voorbeeld
Hier kunnen we zien dat in onze klasse self
een andere waarde heeft – het verwijst naar de Hello
klasse.
Ook hebben we geen toegang tot variabelen en methoden die buiten de klasse zijn gedefinieerd.
Merk op dat we toegang hebben tot instantievariabelen in instantiemethoden om dezelfde redenen die in het eerste deel van het artikel zijn beschreven.
In deel II & III gaan we spelen met scopes door gebruik te maken van modules, geneste klassen, en blokken (FLAT SCOPES).
Voilà !