Previous | Indholdsfortegnelse | Next |
Forståelse af Ruby Variables | Ruby talklasser og konverteringer |
Nu da vi har gennemgået det grundlæggende om variabler i Ruby, er den næste opgave at forklare Ruby variable scope.
Hvad er Variable Scope?
Scope definerer, hvor i et program en variabel er tilgængelig. Ruby har fire typer af variabel scope, nemlig local, global, instance og class. Derudover har Ruby én konstanttype. Hver variabel type deklareres ved at bruge et specialtegn i begyndelsen af variabelnavnet som skitseret i følgende tabel.
Navnet begynder med | Variabelomfang |
---|---|
$ |
En global variabel |
En instansvariabel | |
eller _ |
En lokal variabel |
|
En konstant |
@@ |
En klassevariabel |
Dertil kommer, Ruby har to pseudo-variabler, som ikke kan tildeles værdier. Disse er nil, som tildeles uinitialiserede variabler, og self, som henviser til det objekt, der i øjeblikket udføres. I resten af dette kapitel vil vi se på hvert af disse variabelomfang efter tur.
Detektering af omfanget af en Ruby-variabel
Det er indlysende, at man kan se omfanget af en variabel ved at se på navnet. Nogle gange har du dog brug for at finde ud af scope på programmatisk vis. En nyttig teknik til at finde ud af omfanget af en variabel er at bruge metoden defined?. defined? returnerer omfanget af den variabel, der henvises til, eller nil, hvis variablen ikke er defineret i den aktuelle kontekst:
x = 10=> 10defined? x=> "local-variable"$x = 10=> 10defined? $x=> "global-variable"
Ruby lokale variabler
Lokale variabler er lokale for den kodekonstruktion, hvori de er deklareret. En lokal variabel, der er deklareret i en metode eller inden for en løkke, kan f.eks. ikke tilgås uden for den pågældende løkke eller metode. Navne på lokale variabler skal begynde med enten en understregning eller et lille bogstav. For eksempel:
loopcounter = 10_LoopCounter = 20
Ruby Globale variabler
Globale variabler i Ruby er tilgængelige fra alle steder i Ruby-programmet, uanset hvor de er deklareret. Globale variabelnavne har et dollartegn ($) som præfiks. For eksempel:
$welcome = "Welcome to Ruby Essentials"
Brug af globale variabler frarådes kraftigt. Problemet med globale variabler er, at de ikke blot er synlige overalt i koden til et program, men også kan ændres fra et hvilket som helst sted i programmet. Dette kan gøre det vanskeligt at spore fejl.
Det er dog nyttigt at vide, at en række foruddefinerede globale variabler er tilgængelige for dig som Ruby-udvikler for at få oplysninger om Ruby-miljøet. Et kort resumé af hver af disse variabler er indeholdt i følgende tabel.
Variabelnavn | Variabelværdi | |
---|---|---|
|
Placeringen af seneste fejl | |
$_ |
Den streng, der sidst blev læst af gets |
|
$. |
Linjenummeret sidst læst af fortolkeren | |
$& |
Den streng, der sidst er matchet af regexp | |
$~ |
Den sidste matchning af regexp, som et array af deludtryk | |
$ n |
Det niende deludtryk i det sidste match (det samme som $~ ) |
|
$= |
Case-ufølsomhedsflag | |
$/ |
Indgangspostens separator | |
$\ |
Udgangsposten separator | |
|
Navnet på den ruby scriptfil, der i øjeblikket udføres | |
$* |
Den kommandolinjeargumenter, der blev brugt til at påkalde scriptet | |
Ruby-fortolkerens proces-id | ||
$? |
Afslutningsstatus for den senest udførte underordnede proces |
For eksempel kan vi udføre gets-metoden for at modtage input fra tastaturet, og derefter henvise til variablen $_ for at hente den indtastede værdi:
irb(main):005:0> getshello=> "hello\n"irb(main):006:0> $_=> "hello\n"
Alternativt kan vi finde proces-id’et for Ruby-fortolkeren:
irb(main):007:0> $$=> 17403
Ruby-klassevariabler
En klassevariabel er en variabel, der deles blandt alle instanser af en klasse. Det betyder, at der kun findes én variabelværdi for alle objekter, der er instantieret fra denne klasse. Det betyder, at hvis en objektinstans ændrer værdien af variablen, vil den nye værdi i det væsentlige ændre sig for alle andre objektinstanser.
En anden måde at tænke på klassevariabler på er som globale variabler inden for rammerne af en enkelt klasse.
Klassevariabler deklareres ved at sætte to @-tegn (@@) foran variablenavnet. Klassevariabler skal initialiseres på oprettelsestidspunktet. For eksempel:
@@total = 0
Ruby Instansvariabler
Instansvariabler svarer til Klassevariabler, bortset fra at deres værdier er lokale for specifikke instanser af et objekt. Hvis en klasse f.eks. indeholder en instansvariabel kaldet @total, hvis en instans af objektet ændrer den aktuelle værdi af @total, er ændringen kun lokal for det objekt, der har foretaget ændringen. Andre objekter af samme klasse har deres egne lokale kopier af variablen, som er uafhængige af ændringer foretaget i andre objekter.
Instansvariabler deklareres i Ruby ved at sætte et enkelt @-tegn foran variabelnavnet:
@total = 10
Ruby Constant Scope
Ruby-konstanter er værdier, der, når de først har fået tildelt en værdi, ikke bør ændres. Jeg siger bør, fordi Ruby adskiller sig fra de fleste programmeringssprog ved at tillade, at en konstantværdi kan ændres, efter at den er blevet erklæret, selv om fortolkeren vil protestere lidt med en advarselsmeddelelse.
Konstanter, der er erklæret inden for en klasse eller et modul, er tilgængelige overalt inden for den pågældende klasses eller moduls kontekst. Konstanter, der er erklæret uden for en klasse eller et modul, tildeles global rækkevidde.
Præcedent | Indholdsfortegnelse | Næste |
Forståelse af Ruby-variabler | Ruby-talklasser og -konverteringer |