Előző | Tartalomjegyzék | Következő |
A Ruby változók megértése | Ruby számosztályok és konverziók |
Most, miután áttekintettük a Ruby változóinak alapjait, a következő feladat a Ruby változó hatókörének ismertetése.
Mi a változó hatókör?
A hatókör határozza meg, hogy egy változó a programban hol érhető el. A Ruby négyféle változó hatókörrel rendelkezik: lokális, globális, példány és osztály. Ezen kívül a Rubynak van egy konstans típusa is. Az egyes változótípusok deklarálása egy speciális karakter használatával történik a változó neve elején a következő táblázatban leírtak szerint.
Name Begins With | Variable Scope |
---|---|
$ |
A globális változó |
@ |
Egy példányváltozó |
vagy _ |
Egy helyi változó |
|
Egy konstans |
@@ |
Egy osztályváltozó |
Mellett, A Ruby-ban van két olyan pszeudováltozó, amelyekhez nem lehet értéket rendelni. Ezek a nil, amely a nem inicializált változókhoz rendelhető, és a self, amely az éppen futó objektumra utal. A fejezet hátralévő részében sorra vesszük ezeket a változók hatókörét.
Detecting the Scope of a Ruby Variable
Nyilvánvaló, hogy egy változó hatókörét a nevéből meg lehet állapítani. Néha azonban programozottan kell kideríteni a hatókörét. Egy hasznos technika egy változó hatókörének kiderítésére a defined? metódus használata. defined? visszaadja a hivatkozott változó hatókörét, vagy nil-t, ha a változó nincs definiálva az aktuális kontextusban:
x = 10=> 10defined? x=> "local-variable"$x = 10=> 10defined? $x=> "global-variable"
Ruby helyi változók
A helyi változók lokálisak abban a kódkonstrukcióban, amelyben deklarálták őket. Például egy metódusban vagy ciklusban deklarált helyi változóhoz nem lehet hozzáférni az adott cikluson vagy metóduson kívül. A helyi változók neveinek vagy aláhúzással vagy kisbetűvel kell kezdődniük. Például:
loopcounter = 10_LoopCounter = 20
Ruby globális változók
A Rubyban a globális változók a Ruby program bármely pontjáról elérhetők, függetlenül attól, hogy hol vannak deklarálva. A globális változók nevei előtt egy dollárjel ($) áll. Például:
$welcome = "Welcome to Ruby Essentials"
A globális változók használata erősen nem ajánlott. A globális változókkal az a probléma, hogy nemcsak a program kódjában bárhol láthatók, hanem az alkalmazás bármely pontjáról megváltoztathatók. Ez megnehezítheti a hibák nyomon követését.
Nem árt azonban tudni, hogy számos előre definiált globális változó áll a Ruby fejlesztőjének rendelkezésére, hogy információt kapjon a Ruby környezetéről. Az egyes változók rövid összefoglalása a következő táblázatban található.
Változó neve | Változó értéke |
---|---|
|
A legutóbbi hiba helye |
$_ |
Az utoljára gets |
$. |
Az értelmező által utoljára olvasott sorszám |
$& |
A regexp által utoljára illesztett karakterlánc |
$~ |
Az utolsó regexp találat, mint részkifejezések tömbje |
$ n |
Az n-edik részkifejezés az utolsó egyezésben (ugyanaz, mint $~ ) |
$= |
Az eset-érzéketlenségi jelző |
$/ |
A bemeneti rekord elválasztójel |
$\ |
A kimeneti rekord. elválasztó |
|
Az aktuálisan végrehajtott ruby script fájl neve |
$* |
A parancssori argumentumok, amelyekkel a szkriptet meghívtuk |
$$ |
A Ruby-interpreter folyamatazonosítója |
$? |
Az utoljára végrehajtott gyermekfolyamat kilépési állapota |
Ezzel a módszerrel például a gets metódust hajthatjuk végre a billentyűzetről történő bevitelhez, majd a $_ változóra hivatkozva lekérdezzük a beírt értéket:
irb(main):005:0> getshello=> "hello\n"irb(main):006:0> $_=> "hello\n"
Alternatívaként megkereshetjük a Ruby-interpreter folyamatazonosítóját:
irb(main):007:0> $$=> 17403
Ruby osztályváltozók
Az osztályváltozó olyan változó, amely egy osztály összes példánya között közös. Ez azt jelenti, hogy csak egy változó értéke létezik az adott osztályból instanciált összes objektum számára. Ez azt jelenti, hogy ha egy objektumpéldány megváltoztatja a változó értékét, akkor az új érték lényegében az összes többi objektumpéldány számára is megváltozik.
Az osztályváltozókat másképpen is lehet úgy elképzelni, mint globális változókat egyetlen osztályon belül.
Az osztályváltozókat a változó nevének két @ karakterrel (@@) történő előtagozásával deklaráljuk. Az osztályváltozókat a létrehozáskor inicializálni kell. Például:
@@total = 0
Ruby példányváltozók
A példányváltozók hasonlóak az osztályváltozókhoz, kivéve, hogy értékeik egy objektum konkrét példányaihoz lokálisak. Például ha egy osztály tartalmaz egy @total nevű példányváltozót, ha az objektum egy példánya megváltoztatja a @total aktuális értékét, a változás csak a módosítást végző objektum számára lokális. Ugyanannak az osztálynak más objektumai rendelkeznek a változó saját helyi másolataival, amelyek függetlenek a többi objektumban végrehajtott változásoktól.
A példányváltozókat a Rubyban úgy deklaráljuk, hogy a változó nevét egyetlen @ jellel előlegezzük meg:
@total = 10
Ruby Constant Scope
A Ruby konstansok olyan értékek, amelyeknek, ha egyszer értéket kaptak, nem szabad megváltoztatni őket. Azért mondom, hogy kellene, mert a Ruby abban különbözik a legtöbb programozási nyelvtől, hogy lehetővé teszi a konstans értékének megváltoztatását a deklarálás után, bár az értelmező kissé tiltakozni fog egy figyelmeztető üzenettel.
Az egy osztályon vagy modulon belül deklarált konstansok az adott osztály vagy modul kontextusán belül bárhol elérhetőek. Az osztályon vagy modulon kívül deklarált konstansok globális hatókörrel rendelkeznek.
Előző | Tartalomjegyzék | Következő |
A Ruby változók megismerése | Ruby számosztályok és konverziók |