Ruby nyelv
Története Yukihiro Matsumoto (szül ápr. 4.) alkotta meg, az ideális script nyelv hosszú eredménytelen keresése után. A lehetséges jelöltek az ideális nyelvekre, a Perl és a Python nem egészen azt nyújtották, amire várt, a Perl nem volt elég erőteljes, a Python pedig nem volt elég objektum-orientált. A nyelv a kezdetekben Japánban vált népszerűvé, ma ott már népszerűbb, mint a Python (2007. májusban 3,78% a világranglistán – C#-ot és a JavaScriptet leelőzve). A világ többi pontjára azonban nem jutott el egészen 2006-ig ben jelent meg ugyanis David Heinemeier Hansson munkája a Ruby on Rails, ami egy erőteljes webalkalmazás fejlesztői környezet, Ruby nyelven írva. A programozóknak ez volt a motiváció, hogy elkezdjenek foglalkozni a Ruby-val. És ez hozta meg Ruby számára a népszerűséget 2006-ban szinte robbanásszerűen. A Ruby jövője véleményünk szerint attól függ, mennyire terjednek el a webalkalmazások, ugyanis azokra talán az egyik legjobb megoldás a Ruby on Rails.
A nyelvről Script nyelv (értelmezett) Minden operációs rendszeren futtatható (ahová megírták az értelmezőt) Teljesen objektum orientált Dinamikusan típusos, bár a típus itt más: minden osztálypéldány Nincs változó deklaráció, csak definíció Sokat örökölt ezektől a nyelvektől: Perl, Python, Smalltalk Japánban készült, 1995-ben 2007 májusi állás szerint a 10. legnépszerűbb nyelv, 2,8%-al, olyanok előtt, mint: Delphi, Pascal, PL/SQL, Lisp, Ada, Logo, Smalltalk (
Különlegességek Reguláris kifejezés beépített osztály true, false, nil, self mind osztályok Mindennek van visszatérési értéke Nem kötelező a return Nem kötelezők a zárójelek függvényhíváskor (de néha egyértelműbb, ha van zárójel) Van párhuzamos értékadás Függvények bemenetei nincsenek típushoz kötve („Duck Typing”, azaz használjunk olyan operátorokat, amik több osztályra is az ott logikus műveletet végzik, és akkor nyugodtan válthatunk osztályt a bemeneten… pl. a string-re a << hozzáfűzés, a tömbre a tömb végéhez csatolás, egy ilyen operátort használó függvénynek string és tömb paramétert is adhatunk)
Felhasználói kör amatőrtől professzionálisig Több helyen is használják kezdő programozási nyelvként az oktatásban (japán, Chris Pine stb.), de készítenek ezen a nyelven nagyméretű projekteket is (főleg a Rails körében) Alkalmas kezdő nyelvnek, ráadásul a későbbiek során sem feltétlenül szükséges átnyergelni más, „profibb” nyelvre, ha komolyabb programokat akar írni
Beépített nyelvi elemek Sok Ha az alapértelmezettel elérhető nyelvi elemek gazdagságát tekintjük inkább amatőr nyelvnek vélhetjük (rendezések, kiválogatások, verem-, sor-, listaműveletek, stb.), azonban az „elemi utasítások” nagy része is elérhető benne. A fejlett adatszerkezet rendelkezésre állásával sok fejlesztési időt takaríthat meg.
Hordozhatóság Módjával A nyelv még elevenen éli serdülőkorát, és a fejlesztés különböző verzióiban alapvető különbségek is előfordulnak
Feladatorientáltság Univerzális programnyelv Speciális feladatokra (adatbáziskezelés, xml feldolgozás, ablakkezelés, hálózati programozás, matematika stb.) folyamatosan születnek és fejlődnek osztálykönyvtárak
Végrehajtás Interpretált nyelv Ennek következtében teljesítményre lassabb is, mint a fordított nyelvek, de készül már egy olyan fordító (jruby), amely Java bytekódra fordít. A végeredmény hordozhatóságát csökkenti ez a jellemző, ugyanis csak olyan gépen futtatható a program, amelyen van ruby interpreter
Platform Független Ruby interpreter egyaránt telepíthető Windows,Linux, Mac OS X és egyéb operációs rendszerekre
Licensz Nyílt forráskódú, kereskedelmi célra is ingyenes Pedagógiai szempontból is előnyös Párhuzamosság Lehetőség nyílik a többszálú feladat feldolgozásra
Objektum elvű …de nagyon Nehéz lenne ennél objektum-elvűbb nyelvet alkotni. Ennek ellenére írható benne utasításorientált program is Annak ellenére, hogy a végletekig objektumelvű, nem teszi ezt tenyérbe mászóan. Lehet „hagyományos módon” is programot írni, ahol csak a „változókra”, „függvényekre” és szerkezetekre építünk (figyelmen kívül hagyva, hogy ezek objektumok, vagy objektumokhoz kötődnek)
Szintaxis Laza Annak ellenére, hogy sokban hasonlít a Pythonra, nem olyan erőszakos formai szempontból (behúzások stb.). Tömör és könnyen olvasható
Strukturáltság Nincs szintaxissal kitüntetett főprogram („main”). Részprogramokat, akár kódokat, akár osztálydefiníciókat külön állományokban is elhelyezhetünk, és egymásba fűzhetünk. Egy állomány nem csak egy osztályt tartalmazhat. Névterek, osztályok, függvények, öröklődés
Típusosság Típusok nincsenek, minden változó osztálypéldány. A változókat nem kell deklarálni, kezdő értékadáskor dől el, hogy mely osztály példányát képviselik. Ha azonban egy olyan változót akarunk használni, amely még nem volt létrehozva, nem fogja automatikusan létrehozni valamilyen kezdőértékkel, hanem hibát ad. Ha a későbbiekben a változónak egy más osztályt adunk értékül, teljes mértékben átveszi az újérték osztályát Nincs automatikus típus átalakítás
Típusosság Függvény definiálásakor nem kell meghatározni a ki és bemeneti változók típusát és számát sem. Be- és kimenet is lehet tetszőleges objektum, tömb vagy függvény. Minden dolog referencia szerint van tárolva és átadva, illetve a metódusok minden esetben visszatérnek valamivel. Nincs olyan, hogy nem tér vissza semmivel. Ha nincs eredmény, akkor is legalább egy „nil” az eredmény. Ez tisztább, olvashatóbb kódot eredményez
Típuskompatibilitás A szám-szöveg osztályoknál meg van a lehetőség az összehasonlító operátorok használatára, ám lehetőségünk van arra, hogy az osztályokhoz magunk definiáljunk operátorokat.
Egyéb Beépíthetünk C-be írt programokat, valamint Ruby programot is beépíthetünk C programokba Dokumentumok a Ruby-ról főképp angolul íródtak, csak kevés magyar
Shell: !/bin/bash Ruby: !/usr/bin/ruby1.9 #-al tudunk megjegyzést írni
Operátorok Ua. mint a C++-ban… Összehasonlító: ; =; != Logikai: !; or; and …de kibővült néhánnyal: **<=hatványozás =~<=hasonlító operátor(pl. reguláris kifejezéshez) !~<=előző tagadása <<<=hozzáadás strinhez, tömhöz, stb. <=hasonlító operátor(-1,0,+1 kimenetekkel) Ruby-ban nincsenek egyel csökkentő és növelő operátorok: ++ és --, (helyette: a += 1, a -= 1) Engedélyezett a párhuzamos értékadás is
Nevezéktan Lokális változókat, függvényeket, metódusokat és paramétereik nevét mindig kis betűvel, vagy aláhúzással kezdjük. Pl.: ugyfel; munka; _munka Példányváltozók jellel kezdődik. Többtagú neveket aláhúzással bontsuk részekre, hogy könnyebben olvashatóak Osztályok, konstansok nevei nagy kezdőbetűvel kezdődnek. Ekkor a többtagú szavakat egybe szokás írni, úgy hogy minden szó elejét nagy kezdőbetűvel írjuk Pl.: Ugyfel; NyariMunka A tananyag során fogunk találkozni szimbólumokkal. A szimbólum neve kettősponttal kezdődik, de hogy mik is ezek, arról majd később lesz szó. Pl.: :id; :ugyfel_neve
Kiiratás Két parancs: - puts(‘ ’+v+’ ’ \n nem kell); - print(” ”,v,” ” \n kell) puts 1, 2, 3 puts ‘szöveg’ ”másik szöveg” puts 5 #5 puts 5.to_f #5.0 (float) puts 7.99.to_i #7 (int) puts ‘elso’ + 7.to_s + ‘masodik’ #(string) print 7.99.to_i,”\n” print „valami ”,ez_egy_int,” másik valami”
Objektumok, beolvasás Értékadás: valtozo=”ertek” vagy valtozo=‘ertek’ vagy valtozo=20 vagy a=b=1 Beolvasás: - sor = gets (stringet kapunk+enter) - sor = gets.to_f (float) (18.5//18,5)!!! - sor = gets.chomp (string végjel nélkül) - puts file.gets (fájlkezelésnél előfordulhat, hogy nincs több sora a fájlnak, és így a „.gets” „nil”-t ad vissza, azaz üres-nem létező objektumot, melynek értéke hamis, az összes többi létezőnek igaz)
Műveletek: hatványozás: ertek ** kitevo Pi lekérdezése: Math:PI Randomoltatás: valtozo=rand() (0- 1között).upcase.reverse
Feltételvizsgálat if a<b then # mi van ha a feltétel igaz else # mi van ha hamis end
Ciklusok while feltetel do # ezt ismételd míg a feltétel nem teljesül end until feltetel do # ezt ismételd míg a feltétel teljesül end
Case print ‘Átlag(1) vagy éltanulók(2)’ ohaj = gets.chomp case ohaj when ‘1’: print ‘Átlagot válaszotta’ when ‘2’: print ‘Éltanulókat választotta’ else: print ‘Ellenkező esetben’ end
Fájlkezelés olvasando_fajl = File.open('konyvtar/fajl.txt', 'r') sor = olvasando_fajl.gets #… olvasando_fajl.close irando_fajl = File.open('konyvtar/fajl.txt', 'w') # továbbírás esetén 'a' irando_fajl.puts 'fájlba irandó tartalom' #… irando_fajl.close
Fájlkezelés File.exist?(utvonal) true/false aszerint, hogy a fájl létezik-e Pl.: while !File.exist?(utvonal) do puts ‘A fájl nem létezik vagy rossz az útvonal’ utvonal=gets end
Tömbök tombnev=[1,2,3,4] masodik_tomb=[‘elso’,’masodik’,3,…] # 0-tól sorszámozódik tombnev.length / tombnev.size masodik_tomb[1] #...’masodik’ tombnev <<‘’15.9’’#elem hozzáfűzése tomb = %w {Most akkor minden szó egy eleme lesz a tömbnek}
Tömb bejárása: while index < tomb.size do #...műveletek index = index + 1 #...vagy index += 1 end …de ez valójában nem Ruby-s bejárás. Tömb elemein való műveletvégzés során a tömb elemei NEM változnak! tomb.each do |elem| puts elem end
foreach(int i in tomb) { Console.WriteLine(i); } tomb.each { |elem| puts elem } …vagy… tomb.each do |elem| puts elem end
Az előző módszerrel listákat is lehet kezelni. Pl.: File.open('fajl.txt', 'r').each do |sor| puts sor end
Hashek Bármilyen objektummal indexelnek: h = {'kulcs' => 'cica', 'kulcs2' => 'kutya'} h.each do |kulcs, elem| puts kulcs,"=>",elem end
Hashek honapok = { :elso => "Január", :masodik => "Február" } # itt szimbólumokkal hivatkozunk, mert így gyorsabb a futás és átláthatóbb a kód honapok[:elso]#Január
Blokkok és Yield A blokkok olyan kódrészletek, amiket paraméterként tudunk átadni függvényeknek, ezeknek a kódrészleteknek lehetnek paraméterei, amiket a kódrészlet híváskor a függvény paraméterez. A függvényen belül a blokkot a yield paranccsal tudjuk meghívni. A blokkokat vagy {} jelek közé, vagy do end párok közé zárjuk.
Blokkok és Yield def fib_up_to(max) i1, i2 = 1, 1 while i1 <= max yield i1 i1, i2 = i2, i1+i2 end fib_up_to(100) {|f| print f, " " }
Példák class Ugyfel def initialize(nev, = = szuletesi_ev end def nev end def szuletesi_ev end def eletkor return end end gj = Ugyfel.new('Gipsz Jakab', 1972) puts gj.nev puts gj.szuletesi_ev puts gj.eletkor
def jo_munkat(nev) result = "Jó munkát " + nev + " !" end puts jo_munkat("Rails mester") Miért nincs return a függvényben?
def jo_munkat(nev) result = "Jó munkát #{nev}!" end puts jo_munkat("Rails mester")
def jo_munkat(nev) "Jó munkát #{nev}!" end puts jo_munkat("Rails mester")
class Ugyfel def initialize(nev, = = szuletesi_ev end def nev end def end end gj = Ugyfel.new(‘’Gipsz Jakab‘’, 1972) puts gj.nev gj.nev=‘’Humor Herold’’ puts gj.szuletesi_ev
Mi most kézzel írtuk meg azokat az egyszerű metódusokat amikkel példányváltozónk értékét lehetett lekérdezni vagy módosítani. Van erre egyszerűbb megoldás is: class Ugyfel attr_accessor :nev (getter és setter) attr_reader :beosztas (getter) attr_writer :fizetes (setter)
class Ugyfel attr_accessor :nev attr_reader :szuletesi_ev def initialize(nev, = = szuletesi_ev end end gj = Ugyfel.new(‘’Gipsz Jakab‘’, 1972) puts gj.nev gj.nev=‘’Humor Herold’’ puts gj.nev
Érdekességek #Ha még nincs értéke a szam változónak, akkor az egyenlőség mögött álló kifejezés kerül bele. Itt éppen 0. Ha már van, akkor nem csinál semmit. szam ||= 0 #Kiírja, hogy "hello", ha a név Jakab. puts "hello" if name == "Jakab"
Érdekességek #A feltétel hamis volta érdekel minket: if !true puts "hamis" end #Ugyanez másképp: unless true puts "hamis" end #vagy… puts ‘’hamis” unless false
Struktúrák module NameSpace class Example CONST = 123 end obj = NameSpace::Example.new a = NameSpace::Example::CONST