Concepte si tipuri de date simple in Ruby
28.09.2009
In acest tutorial vei putea citi cateva lucruri legate de sintaxa limbajului Ruby, in cea mai rapida modalitate care sa permita totusi instruirea completa cu privire la subiect.
2030 afisari 0 Rating (3 voturi) 20 min

In acest tutorial vei putea citi cateva lucruri legate de sintaxa si lingvistica limbajului Ruby, in cea mai rapida modalitate care sa permita totusi instruirea completa cu privire la subiect. Daca te consideri a fi un guru Ruby sau urasti tutorialele dintr-un motiv sau altul, atunci sunt aproape convins ca nu vei citi ceea ce urmeaza.

Conceptele de baza Ruby

Ruby este un limbaj orientat pe obiecte, dar inainte de a sari peste aceasta sectiune deoarece crezi ca stii despre ce este vorba fiindca ai utilizat C++ sau orice alt limbaj orientat pe obiecte, te rog sa te linistesti si sa citesti cel putin urmatoarea propozitie. In Ruby, orice este un obiect. Orice. Chiar si rezultatele operatiunilor asupra respectivelor obiecte sunt tot obiecte; aceasta abordare difera de C++ sau Java, in care exista tipuri de date primitive sau unele instructiuni care nu returneaza o valoare.

Daca nu ai programat niciodata intr-un limbaj orientat pe obiecte, atunci este o alta poveste. In general, cand scrii cod Ruby sau orice cod orientat pe obiecte, ideea este sa creezi modele cu ajutorul carora sa poti implementa aplicatia. De exemplu, daca ai crea o aplicatie carte de bucate, probabil ca ai dori sa creezi o lista de retete.

Daca nu ai lucra cu obiecte, ar trebui sa utilizezi o serie de liste sau vectori, astfel incat sa poti retine diversele tipuri de retete si sa poti urmari pozitia fiecarei retete dintr-o lista.

Programarea orientata pe obiecte simplifica aceasta sarcina, permitand crearea de clase si obiecte cu ajutorul carora poti modela componentele necesare. Utilizand exemplul nostru, ai putea crea o clasa Reteta cu proprietatile nume, autor si un vector de ingrediente. Scopul unei clase este de a modela ceva in aplicatia ta; clasele creeaza "prototipul" pentru substantivele din programele tale: obiectele. Instantele clasei, sau obiectele (termenii sunt echivalenti), vor prelua acel prototip si il vor pune in actiune. In exemplul nostru, am putea crea obiecte sau instante ale clasei Reteta pentru fiecare reteta in parte. Fiecare obiect va putea detine informatii, executa actiuni aferente retetelor (de exemplu, sa adauge elemente noi in lista de ingrediente, etc.) si activa o serie de constrangeri care pot fi aplicate asupra unei retete normale (de exemplu, sa permita doar valori numerice pentru a exprima cantitatile de ingrediente, sa se asigure ca exista denumiri pentru retete, etc.).

Tipuri de date in Ruby

Desi in Ruby orice reprezinta un obiect, nu inseamna ca totul este generic (adica nu exista functionalitati specifice) sau ca nu exista clase built-in. Ruby iti pune la dispozitie o serie de clase predefinite pe baza carora se pot construi toate componentele unei aplicatii. Aceste tipuri difera de cele din alte limbaje de programare deoarece sunt generate din aceeasi clasa: clasa Object. Aceasta ierarhie simbolizeaza ca exista un singur tip de "baza", si nu un numar de tipuri primitive ca in alte limbaje cum ar fi C sau Java. In continuare, vom analiza aceste tipuri si avantajele pe care ele le ofera programatorilor.

Tipul String

Primul tip este reprezentat de sirurile de caractere sau string. Acestea sunt de fapt secvente de octeti ce compun o secventa de caractere. Acest tip de date poate fi initializat in mai multe moduri, dar cel mai comun dintre acestea este prin utilizarea unui string literal. Un string literal este un sir de caractere constant, creat prin includerea sa intre apostrofi sau ghilimele. De exemplu:

 
puts 'Hello, Darling.' -> Hello, Darling.
puts 'What's up?' -> What's up?
puts "AtTab." -> A tab.

Asteapta! Ce reprezinta acele backslash-uri? Acelea sunt secvente escape, adica un backslash urmat de un caracter pentru a crea caractere neprintabile in mod normal (de ex. in acest exemplu am utilizat t pentru a defini un caracter tab, dar poti utiliza si altele pentru a crea linii noi si taburi verticale). Am spus neprintabile deoarece in celalalt exemplu am utilizat ' pentru a crea un apostrof. In mod normal, acest caracter nu ar fi afisat deoarece este continut intr-un set de apostrofi, ceea ce inseamna ca daca nu punem backslash, el va inchide sirul de caractere, cauzand o eroare.

Acum, daca ai observat, am utilizat apostrofi pentru unele string-uri si ghilimele pentru altele. Exista o diferenta intre cele doua notatii. String-urile cuprinse intre apostrofi permit un set limitat de secvente escape (de fapt sunt acceptate doar caracterele apostrof si backslash) si sunt inutile in afara cazului in care esti preocupat de performanta (si transformarea string-urilor cu ghilimele in string-uri cu apostrofi ar fi ultimul lucru de efectuat cand incerci sa iti optimizezi aplicatia). Pe de alta parte, sirurile de caractere cuprinse intre ghilimele ofera functionalitati sporite, permitand mai multe secvente escape. Dupa cum ai putea vedea in exemplu de mai sus, putem utiliza n pentru a crea un caracter linie noua, t pentru a crea un caracter tab si asa mai departe. In continuare, poti vedea un tabel al tuturor secventelor escape disponibile pentru utilizarea cu string-uri delimitate de ghilimele (sunt cateva).

Secvente Escape
a Sonerie
??? Numar octal
x?? Numar hexazecimal
#{???} Valoarea ???, unde ??? este o expresie Ruby
e Escape
c?
C-?
Control-?
M-? Meta
M-C-? Meta-Control-?
f Feed form
n Linie noua
f Return
s Spatiu
t Tab
w Tab vertical
b Backspace

Privind tabelul, poti observa ca string-urile cu ghilimele prezinta o alta caracteristica interesanta: interpolarea expresiilor. Suna grozav, dar in realitate inseamna doar ca poti insera valoarea portiunilor de cod Ruby direct intr-un sir de caractere. Aminteste-ti ca in Ruby totul reprezinta un obiect, chiar si rezultatele expresiilor sunt tot obiecte. Aceasta inseamna ca poti scrie urmatoarele instructiuni:

 
"Inches/yard: #{12*3}" -> Inches/yard: 36
"#{"Tora! "*3}" -> Tora! Tora! Tora!

Cel de-al doilea exemplu este confuz, daca nu iti amintesti ca totul reprezinta un obiect in Ruby (da, chiar si un string literal, apartine clasei String.). Deoarece un string literal creeaza un obiect String, poti actiona asupra lui exact ca in cazul oricarui alt obiect. In acest caz, multiplicarea unui string cu 3 efectueaza pur si simplu ceea ce te-ai astepta: face trei copii ale stringului.

Un alt mod mai putin grozav de creare a string-urilor il reprezinta utilizarea unui delimitator special: %Q sau %q. Acest constructor functioneaza prin amplasarea dupa %Q sau %q a unui caracter non-alfanumeric, pe un singur octet. De exemplu:

 
%q{Hoagies & grinders!} -> Hoagies and grinders!
%Qs#{"Navy beans! "*3}s -> Navy beans! Navy beans! Navy beans!

Observa ca %q actioneaza ca un string delimitat de apostrofi, iar %Q actioneaza ca un string cu ghilimele. Asociaza-le dupa dimensiune: q mic , apostrof, si Q mare, ghilimele.

Un alt mod de creare a string-urilor in Ruby este reprezentat de nefericitele constructii lingvistice ce creeaza un string prin specificarea unui delimitator dupa un set de caractere <<. De exemplu:

 
my_string = <<MY_STRING
This is a simple string that is 
pre-formatted, which means that the 
way it is formatted here including 
tabs and newlines will be duplicated
when I print it out.
MY_STRING

Ultima modalitate care poate fi utilizata pentru a crea o instanta string este de a apela pur si simplu metoda to_s a unui obiect. Majoritatea obiectelor vor returna o valoare standard (de ex. denumirea clasei si id-ul instantei sau ceva similar), dar altele ofera mai multe avantaje. De exemplu, Fixnum va returna un sir de caractere ce contine o valoare numerica.

Tipuri numerice

Al doilea tip este reprezentat de clasele predefinite pentru numere: Fixnum si Bignum. Cand cream un obiect numeric, orice valoare intreaga din intervalul (-230,230 - 1) este atribuita unui obiect Fixnum, iar orice alt numar ce se afla in afara acestei arii este atribuit unei instante de tip Bignum; Ruby efectueaza aceasta operatie in mod transparent, asa ca nu trebuie sa te preocupe ce tip de date sa utilizezi.

Numerele intregi sunt create prin tastarea valorii respective fara ghilimele (altfel devin siruri de caractere).

In plus, Ruby lucreaza cu formate diferite in functie de baza numerica pe care intentionezi sa o utilizezi. Astfel, Ruby suporta operatii cu numere zecimale (baza-10), dar si operatii cu numere octale (baza-8), hexazecimale (baza-16) si binare (baza-2). De exemplu:

 
-123456789 -> -123456789 # Fixnum
0d123456789 -> 1234567890 # Fixnum
1234323424231 -> 1234323424231 # Bignum
0x5C1 -> 1473 # Hexazecimal
01411 -> 777 # Octal
1_90_33 -> 19033 # Fixnum

Observa ca Ruby ignora caracterele underscore din numere (Unele persoane aleg sa le utilizeze in loc de virgule pentru numere mai mari pentru a accentua lizibilitatea). Exemplele mai prezinta si notatiile diverselor baze. Pentru a crea un numar binar (baza-2), scrie ob inaintea numarului; pentru a crea un numar octal (baza-8), scrie 0 inaintea numarului; pentru a crea un numar hexazecimal (baza-16), scrie 0x inaintea numarului. Pentru a crea un intreg standard in baza-10, fie pur si simplu tastezi numarul in mod normal (de ex. 1678), sau scrii od inaintea sa (ex. 0d1678).

Pe langa numere intregi, Ruby mai suporta tipul Float pentru numere rationale. De exemplu:

 
1.5 -> 1.5
1.0e5 -> 100000.0
1.e5 -> !NoMethodError

Fiecare latura a punctului zecimal trebuie sa contina un numar. Cand scrii numere rationale in notatie stiintifica, trebuie sa plasezi un 0 langa punctual zecimal, altfel Ruby va incerca sa execute o metoda denumita (de exemplu) e5 din clasa Fixnum.

Deoarece numerele sunt obiecte (totul este un obiect in Ruby), mai contin si metode care pot actiona asupra lor. Poti obtine dimensiunea unui numar cu metoda size, poti converti un numar in string utilizand metoda to_s si multe altele:

 
-4.abs -> 4
6.zero? -> false

Metodele de mai sus sunt denumite in mod evident (metoda abs obtine valoarea absoluta si zero? returneaza true daca numarul este zero), dar nu sunt singurele metode oferite. Verifica documentatia Ruby API pentru mai multe informatii.

Numerele mai ofera si metode care nu par a fi metode la prima vedere: operatorii aritmetici. Iata cateva exemple:

 
2 + 2 -> 4
6 / 3 -> 2
-4 * 2 -> -8

O lista completa a acestor operatori si functiile lor este disponibila mai jos. Un sfat rapid: daca ai programat vreodata in alte limbaje, retine ca operatorii din Ruby functioneaza similar (doar daca nu ai programat intr-un limbaj traznit non-matematic).

Operatori aritmetici
+ Adunare
- Scadere
+ Adunare
/ Impartire
* Inmultire
() Ordinea operatiilor (de ex. expresii de grupare pentru a forta o anumita ordine a operatiilor)
% Restul impartirii

Copyright © 2008-2010 E-LEARN.ro. Toate drepturile rezervate. Conceput si realizat de Neokinetics Software.