Lépjünk be a parancssorba, és gépeljük be az alábbi parancsot:
C:\>irb [Enter]
Egy parancsértelmező indul el, amiben interaktív módon tudunk ruby parancsokat futtatni. A Ruby scripteket futtat, azaz nem fordítja le a scripteket, hanem értelmezi azokat. A kiíró utasítás a put: Próbájuk ki:
put 'Hello Világ'
Ezt kapjuk:
Helló Világ
=>nil
A parancssorba beírhatunk matematikai műveleteket is, illetve stringet. Mivel minden objektum, ezért a stringekre rögtön alkalmazhatunk metódusokat is:
'Zoli'.reverse
=>"iloZ"
'Zoli'.update
=>ZOLI
"Zoli".length
=>4
"Zoli" * 5
=>ZoliZoliZoliZoliZoli
Bakke ilyet is tud?
Ez a parancssor jó, de írjunk már egy kis programot. Bármilyen ASCII editor megteszi, de a rubí alkotói a korábbi csomagba beletettek egy egyszerű editort, amiből könnyű futtatni a ruby programokat. A program neve: sciTE és a C:\ruby\scite könyvtárból indul.
A rubyban minden objektum!
A rubyban a változókat kisbetűvel vagy aláhúzás jellel kezdjük. A változó értékadáskor jön létre, mint a PHP-ban és típust is akkor kap. Tulajdonképpen
nev = "Ez itt egy név"
puts nev =>"Ez itt egy név"
puts nev.upcase =>"EZ ITT EGY NEV"
puts nev.upcase!
puts nev =>"EZ ITT EGY NEV"
Ha egy változón végrehajtunk egy metódust, akkor az a módosított értéket adja vissza, de ha a metódus után "!" jelet teszünk, akkor módosul a változó értéke is.
Hogyan definiáljunk osztályokat?
class Ember
def initialize(nev, szuletesi_ev)
@nev = nev
@szuletesi_ev = szuletesi_ev
end
#Definiálok egy metódust, amely visszaadja az ügyfél nevét.
#Nem kell nev-nek neveznem, nevezhetnem ugyfel_neve-nek is nyugodtan.
def nev
return @nev
end
#Hasonlóan a nev-hez...
def szuletesi_ev
return @szuletesi_ev
end
#Ez a metódus számítja ki az ügyfél életkorát
def eletkor
#Létrehozunk egy aktuális időt tartalmazó objektumot,
#majd lekérjük belőle az évszámot = Time.new.year()
return Time.new.year()-@szuletesi_ev
end
end
A fentiek alapján tehát az
- Osztály neve Nagybetűvel kezdődik .
- az osztályban kell az initialize metódus - ő lesz a konstruktor.
- Az osztályban lévő adatokat a konstruktorban deklarálom. A név elé a @ jelet tesszük.
Ha a deklaráció megvan, akkor példányosíthatjuk is:
fz = Ember.new('Fábián Zoltán', 1961)
puts fz.nev
puts fz.szuletesi_ev
puts fz.eletkor
Összefoglalva a változókat, lokális értékeket, metódusneveket kisbetűvel vagy aláhúzás jellel kezdjük.
A konstansokat és osztályneveket nagybetűvel kezdjük.
A stringek használata során használhatunk '...' és "...." jeleket is. A " használatakor azonban további lehetőségeink vannak. (Aki a PHP-t ismeri, annak ismerős lesz a dolog):
nev = "Zoli"
s = "Ennek az embernek a neve: #{nev} "
puts s =>Ennek az embernek a neve: Zoli
A fenti példában tehát behelyettesítette a "nev" változó értékét a stringbe a program.
A stringek összef?zését a + jellel lehet megtenni.
Ha egy osztály egy tagváltozójának értékét szeretnénk megkapni, akkor érdemes ugyanazt a nevet használni a metódus írásakor, mint a változó neve. Ilyenkor ez egyfajta get metódus, azaz visszaadja a változó értékét. Ha beállítom a változó értékét akkor is használhatom ugyanaz a metódus nevet, csak egy kicsit más szintaktikával.
class Ember
def initialize(nev, szuletesi_ev)
@nev = nev
@szule = szuletesi_ev
end
#Definiálok egy metódust, amely visszaadja az ügyfél nevét.
#Nem kell nev-nek neveznem, nevezhetnem ugyfel_neve-nek is nyugodtan.
def nev
return @nev
end
#Hasonlóan a nev-hez...
def szule
return @szule
end
#Ez a metódus számítja ki az ügyfél életkorát
def eletkor
#Létrehozunk egy aktuális időt tartalmazó objektumot,
#majd lekérjük belőle az évszámot = Time.new.year()
return Time.new.year()-@szuletesi_ev
end
# ez beállítja a változó új értékét
def nev=(masik_nev)
@nev = masik_nev
end
end
A fentiekhez képest van egyszerűbb lehetőség is:
class Ember
attr_accessor :nev #Olvasó és író metódusa sis lesz a névnek.(get és set)
attr_reader :szulido #Olvasó metódus a szuletési időhöz.(get)
attr_writer :fizetes #Író metódus a fizetésnek.(set)
....
end
Mutatók használata
:mutato - Ha : jellel kezdődik. Bármire mutathat - változóra, objektumra, stringre, stb...
A mutatókat arra hazsnáljuk, hogy konstans szövegeket jelöljünk velük, mert akkor csak egy példány van a memóriában, ha stringeket használunk konkrét értékekkel, minden egyes példány plusz memóriát foglal el.
Tömbök
#új tömb létrehozása
tomb = [1, 3.41, "Helló bello"]
tomb[0] #lekérdezzük az Első elemet
tomb << ' van egy kis meló?' #Fűzzünk hozzá egy új elemet
#A szavak tömbbe pakolására van rövidebb lehetőség is.
tomb = %w {Minden szó a tömb egy elemévé válik}
#=> ["Minden", "szó", ...]
Hash táblák (Asszociatív tömbök PHP-ban )
#Létrehozunk egy új hash táblát
#A bal oldalt álló valami az a kulcs, a jobb oldalon van az amit tárolunk
honapok = {
:elso => "Január",
:masodik => "Február"
}
#szimbólumok lesznek a kulcsok. lehetnének szövegek is, de így állítólag gyorsabb
honapok[:elso] #Visszaadja, hogy "Január"
Vezérlési szerkezetek
Elágazás
#Elágazás
if feltétel
puts "nem túl ok"
elsif másik feltétel
puts "majdnem jó"
else
puts "allright"
end
#Ciklus
while feltétel
puts valami
valami += 1
end
Ciklus
#Ciklus
while feltétel
puts valami
valami += 1
end
For ciklus nincsen, de tö9bb nyelven létezik a foreach ciklus, itt is.
for elem in tomb
puts elem
end
Blokkok és Iterátorok
Egy blokk pár sor kód két kapcsos zárójel, vagy egy do..end közé zárva.
{
puts "hello"
}
Vagy
do
puts "Hello "
puts "Bello"
end
Paraméterátadás a blokk részére:
Blokknak át lehet adni paramétereket: A paraméter ez után a blokkon belül használható. A blokk paraméterét || jelek közé kell írni.
do |eloleny|
puts eloleny.nev
end
vagy
{|eloleny|
puts eloleny.nev
}
A {}-jellel jelölt blokkokat egy sorba szokás írni.
{|animal| puts animal.name}
A blokk nem állhat önmagában, ezért a fenti kódokat beírva nem működnek.
Hogyan tudunk végiglépkedni egy tömbön?
Korábban már megmutattuk a for ciklust, most itt egy másik lehetőség, iterátor és blokk segítségével. Az iterátor sorban egymás után visszaadja a tömb egymás utáni elemeit.
tomb.each do |elem|
puts elem
end
#vagy rövidebben {}-val írva:
tomb.each{|elem| puts elem}
#Kiírja a tömb elemeit sorban, mivel az each a tömb iterátora, ami az elemeket sorban bepakolja a blokk |elem| paraméterébe
Kivételkezelés
Kivételkezelésre akkor van szükség, ha a program egy hibán végzetes hibával leállna, de mi azt akarjuk, hogy a felhasználó mégis értelmes választ kapjon. Tegyük fel, hogy egy termékcsoportban nincsen adott azonosítójú termék:
begin
@product = Termekcsoport.find(1)
rescue
#Ide jön, amit akkor kell csinálni, ha valami baj történt.
#Például beleírhatjuk a log fájlba, hogy baj van!
logger.info("Nem található az 1-es azonosítójú termék!")
end
Ha else ágat is definiálunk, akkor a hibátlan futás esetén is kapunk visszajelzést
begin
@product = Product.find(1)
rescue
#Ide jön, amit akkor kell csinálni, ha valami baj történt.
#Például beleírhatjuk a log fájlba, hogy baj van!
logger.info("Nem található az 1-es azonosítójú termék!")
else
#Ide pedig azt, ami akkor következik, ha minden rendben.
logger.info("Megtaláltam az 1-es terméket!")
end
Változó, feltételes inicializálása
Ha még nincs értéke a szam változónak, akkor az egyenl?ség mögöt álló kifejezés kerül bele, ha már van, akkor nem történik semmi.
szam ||= 0
A következő hasznos dolog, hogy Ruby-ban a feltételeket írhatjuk a parancs után is. Az alábbi parancs kiírja, hogy "hello", ha a név Zoli.
puts "hello" if name == "Zoli"
A feltételes elágazát írhatjuk így:
if !true
puts "hamis"
end
és így is:
unless true
puts "hamis"
end
Természetesen az unless is kerülhet a parancs mögé:
puts "hamis" unless false
Itt található egy online szamárvezető, ami végigvisz egy jókora adag ruby nyelvvel kapcsolatos okosságon. Érdemes végigmenni rajta: http://tryruby.hobix.com/