Ruby - első totyogó lépések

Default book

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/