Vorige | Inhoudsopgave | Volgende |
Uitleg Ruby Variabelen | Ruby Getallenklassen en Conversies |
Nu we de basisprincipes van variabelen in Ruby hebben behandeld, is de volgende taak om de reikwijdte van Ruby-variabelen uit te leggen.
Wat is variabele reikwijdte?
Scope definieert waar in een programma een variabele toegankelijk is. Ruby kent vier typen variabele scope, local, global, instance en class. Daarnaast heeft Ruby één constant type. Elk type variabele wordt gedeclareerd door een speciaal teken te gebruiken aan het begin van de naam van de variabele, zoals in de volgende tabel is aangegeven.
Name Begins With | Variable Scope |
---|---|
$ |
Een globale variabele |
@ |
Een instantie-variabele |
of _ |
Een lokale variabele |
|
Een constante |
@@ |
Een klassevariabele |
Een klassevariabele
Daarnaast, Ruby heeft twee pseudo-variabelen waaraan geen waarden kunnen worden toegekend. Dit zijn nil, dat wordt toegewezen aan niet-geïnitialiseerde variabelen, en self, dat verwijst naar het object dat op dat moment wordt uitgevoerd. In de rest van dit hoofdstuk zullen we kijken naar elk van deze variabele scopes op hun beurt.
Detecting the Scope of a Ruby Variable
Het spreekt voor zich dat je de scope van een variabele kunt bepalen door naar de naam te kijken. Soms, echter, moet je de scope programmatisch achterhalen. Een handige techniek om de reikwijdte van een variabele te achterhalen is het gebruik van de defined? methode. defined? retourneert de reikwijdte van de variabele waarnaar wordt verwezen, of nihil als de variabele niet is gedefinieerd in de huidige context:
x = 10=> 10defined? x=> "local-variable"$x = 10=> 10defined? $x=> "global-variable"
Ruby Lokale Variabelen
Lokale variabelen zijn lokaal voor de codeconstructie waarin ze worden gedeclareerd. Bijvoorbeeld, een lokale variabele gedeclareerd in een methode of binnen een lus kan niet worden benaderd buiten die lus of methode. Namen van lokale variabelen moeten beginnen met een underscore of een kleine letter. Bijvoorbeeld:
loopcounter = 10_LoopCounter = 20
Ruby Globale Variabelen
Globale variabelen in Ruby zijn toegankelijk vanaf iedere plek in het Ruby programma, ongeacht waar ze zijn gedeclareerd. Globale variabelen namen worden voorafgegaan door een dollar teken ($). Bijvoorbeeld:
$welcome = "Welcome to Ruby Essentials"
Het gebruik van globale variabelen wordt sterk afgeraden. Het probleem met globale variabelen is dat ze niet alleen overal in de code van een programma zichtbaar zijn, ze kunnen ook overal in de applicatie worden gewijzigd. Dit kan het opsporen van bugs bemoeilijken.
Het is echter handig om te weten dat een aantal voorgedefinieerde globale variabelen beschikbaar zijn voor u als Ruby ontwikkelaar om informatie over de Ruby omgeving te verkrijgen. Een korte samenvatting van elk van deze variabelen is opgenomen in de volgende tabel.
Variabele Naam | Variabele Waarde |
---|---|
|
De lokatie van de laatste fout |
$_ |
De string die het laatst gelezen is door gets |
$. |
Het regelnummer dat het laatst door de interpreter is gelezen |
$& |
De string die het laatst door regexp is gematched |
$~ |
De laatste regexp match, als een array van subexpressies |
$ n |
De n-de subexpressie in de laatste overeenkomst (dezelfde als $~ ) |
$= |
De hoofdletter-ongevoeligheidsvlag |
$/ |
Het scheidingsteken voor invoerrecords |
$\ |
Het scheidingsteken voor uitvoerrecords scheidingsteken |
|
De naam van het ruby script bestand dat momenteel wordt uitgevoerd |
$* |
De commandoregel argumenten gebruikt om het script aan te roepen |
$$ |
Het proces ID van de Ruby interpreter |
$? |
De exit status van het laatst uitgevoerde child proces |
Voorbeeld kunnen we de methode gets uitvoeren om invoer van het toetsenbord te nemen, en dan verwijzen naar de variabele $_ om de ingevoerde waarde op te halen:
irb(main):005:0> getshello=> "hello\n"irb(main):006:0> $_=> "hello\n"
Als alternatief kunnen we de proces-ID van de Ruby-interpreter vinden:
irb(main):007:0> $$=> 17403
Ruby-klassevariabelen
Een klassevariabele is een variabele die wordt gedeeld door alle instanties van een klasse. Dit betekent dat slechts één variabele waarde bestaat voor alle objecten die uit deze klasse voortkomen. Dit betekent dat wanneer een instantie van een object de waarde van de variabele verandert, die nieuwe waarde in wezen voor alle andere instanties van objecten zal veranderen.
Een andere manier om aan klassevariabelen te denken is als globale variabelen binnen de context van een enkele klasse.
Klassevariabelen worden gedeclareerd door de naam van de variabele vooraf te laten gaan door twee @-tekens (@@). Klassevariabelen moeten bij het aanmaken worden geïnitialiseerd. Bijvoorbeeld:
@@total = 0
Ruby Instance Variabelen
Instance variabelen zijn vergelijkbaar met Klasse variabelen behalve dat hun waarden lokaal zijn voor specifieke instanties van een object. Bijvoorbeeld als een klasse een instantie variabele @totaal bevat, als een instantie van het object de huidige waarde van @totaal wijzigt, is de wijziging alleen lokaal voor het object dat de wijziging heeft aangebracht. Andere objecten van dezelfde klasse hebben hun eigen lokale kopieën van de variabele die onafhankelijk zijn van wijzigingen in andere objecten.
Instance variabelen worden in Ruby gedeclareerd door de variabelenaam vooraf te laten gaan door een enkel @ teken:
@total = 10
Ruby Constant Scope
Ruby constanten zijn waarden die, als ze eenmaal een waarde hebben gekregen, niet meer veranderd zouden moeten worden. Ik zeg zou moeten omdat Ruby afwijkt van de meeste programmeertalen in die zin dat het toestaat dat een constante waarde wordt gewijzigd nadat deze is gedeclareerd, hoewel de interpreter enigszins zal protesteren met een waarschuwingsbericht.
Constanten die binnen een klasse of module worden gedeclareerd, zijn overal beschikbaar binnen de context van die klasse of module. Constanten die buiten een klasse of module worden gedeclareerd, krijgen een globaal bereik.
Vorige | Inhoudsopgave | Volgende |
Uitleg Ruby Variabelen | Ruby Getallenklassen en Conversies |