Ruby (programozási nyelv)
|
Ezt a szócikket tartalmilag és formailag is át kellene dolgozni, hogy megfelelő minőségű legyen. További részleteket a cikk vitalapján találhatsz. Ha nincs indoklás a vitalapon, bátran távolítsd el a sablont! |
Ruby | |
Paradigma | többelvű |
Jellemző kiterjesztés |
|
Megjelent | 1995 |
Tervező | Macumoto Jukihiro |
Fejlesztő | Macumoto Jukihiro (és mások) |
Utolsó kiadás | 3.3.0 (2023. december 25.) |
Típusosság | Erősen típusos programozási nyelv, dinamikus típusok, (Duck typing) |
Fordítóprogram | Ruby MRI, JRuby |
Hatással volt rá | Smalltalk, Perl, Lisp, Scheme, Python, CLU, Eiffel, Ada, Dylan |
Befolyásolt nyelvek | Groovy, Nu |
Operációs rendszer | platformfüggetlen |
Licenc | Ruby License GNU General Public License |
Weboldal |
A Ruby nyílt forráskódú, teljesen objektumorientált, interpretált, általános célú programozási nyelv. Macumoto Jukihiro kezdte el megalkotni a nyelvet az 1990-es évek közepén. A fejlesztésbe később többen bekapcsolódtak.
A Ruby nyelv egyszerre több programozási paradigmát valósít meg, így a funkcionális, objektumorientált, imperatív és reflektív paradigmáknak is megfelel. Legfontosabb jellemzői a dinamikus típusosság és az automatikus memóriakezelés. A dinamikus szkriptnyelvek családjába tartozik, a Python, Perl, Lisp, Dylan, Pike vagy CLU nyelvekhez hasonlóan.
Sok platformon működik interpreterének telepítése után. Egyebek mellett a Ruby on Rails keretrendszer révén webes alkalmazások fejlesztésére is alkalmas.
Filozófia
[szerkesztés]A Ruby objektumorientált, a Ruby nyelvben minden objektum. Még egy szám is. Egy szám, például 5, szintén egy objektum, s mint ilyennek, vannak saját metódusai. A to_s metódusával átalakítható szöveggé. Ez esetenként igen fontos, hiszen a nyelv alapvetően típusos:
5.to_s
Ellentétben a procedurális megközelítéssel, ahol az 5 bemeneti paraméter lenne egy IntToStr(5)
jellegű hívásban.
A nyelv típusossága ellenére azonban függvénydefiníciókor nem kell meghatározni a bemeneti (és kimeneti) változók típusát. Egy függvény definíciója lehet például ilyen:
def osszeadas a, b
return a + b
end
Mivel minden függvény automatikusan visszaadja a legutoljára kiértékelt kifejezést, ezért a return kulcsszó használata sokszor nem kötelező:
def osszeadas a, b
a + b
end
Ennek meghívása így történhet:
osszeadas 1, 41 → 42
Talán feltűnik az is, hogy a függvény definíciójánál és meghívásánál a paramétereket nem kell zárójelbe tenni. A zárójel opcionális lehetőség, értelme ott van, amikor egyébként nem lehetne eldönteni, hogy a paraméterek mely függvényhez tartoznak. Például:
osszeadas 1, 2 * 3 → 7
de
osszeadas(1, 2) * 3 → 9
Ilyenkor azonban erősen javallják, hogy a függvény neve és a paramétereit tartalmazó zárójel között ne maradjon szóköz.
Mivel a nyelv dinamikusan kezeli a típusokat, a példában szereplő osszeadas
metódus nem csak számokat, hanem bármilyen más objektumot is kaphat bemeneti paraméterként, amiket az össze is próbál adni a '+' jel segítségével. Amennyiben a kapott objektummal lehet összeadás műveletet végezni (tehát van neki '+' jel nevű metódusa definiálva), akkor ez az egyszerű metódus gond nélkül el tudja végzi a feladatát, mivel össze tudja adni a kapott objektumokat. A sztringek is ilyen összeadható objektumok:
osszeadas "Helló ", "világ!" → "Helló világ!"
A nyelv további sajátossága (típusosságából adódóan) az, hogy nem végez automatikus típuskonverziót. Még számok között sem. Például:
1 / 2 → 0
mert ha az osztandó és az osztó is egész, akkor a hányados is az egész, tehát kerekít. De:
1.0 / 2 → 0.5
1 / 2.0 → 0.5
A számláló egészből lebegőpontossá konvertálható a to_f metódussal, hogy az osztás eredménye is lebegőpontos legyen:
a = 1
a.to_f / 2 → 0.5
A változókat nem kell deklarálni, bárhol be lehet őket vezetni, és a láthatósági tartományokon belül elérhetőek. A változók elé nem kell semmilyen speciális karaktert tenni (mint PHP-ben a $), viszont a nagybetűvel kezdődő kifejezések szigorúan konstansok vagy osztályok:
A = 3 → ez rendben van, rögzített egy A konstanst
A = 4 → „warning: already initialized constant A”
A sorokat nem kell pontosvesszővel lezárni, de lehet. Ennek akkor van értelme, ha több utasítás van ugyanabban a sorban. Ekkor a pontosvessző utasításelválasztóként funkcionál.
Telepítése
[szerkesztés]Linux
[szerkesztés]A Ruby (interpreter) a legtöbb Linux disztribúcióban megtalálható, így a rendszerrel települ fel automatikusan. Az automatikusan települt rendszer nem biztos, hogy a legfrissebb verzió, de telepíthető (.deb és .rpm) telepítőcsomagok segítségével vagy forráskódból is.
Debian alapú disztribúciókban telepíthető az APT segítségével:
sudo apt-get install ruby
Telepítés után rendelkezésre áll a Ruby héj (shell), ami indítható a ruby
paranccsal.
Ha alapból nem tenné fel, érdemes továbbá telepíteni az irb
-t is, ami egy interaktív parancssori értelmező (interpreter) – ezzel azonnal kipróbálható a nyelv, pl. az alábbi beírásával:
print "Szia, itt a Ruby"
Windows
[szerkesztés]Le kell tölteni a telepítőállományt és futtatni kell.
Mac OSX
[szerkesztés]Feltelepítve tartalmazza az operációs rendszer.
IRB - az Interaktív Ruby Shell
[szerkesztés]Gyors és egyszerű módját nyújtja kisebb Ruby kódok kipróbálásának. Minden soremelés (Enter) vagy ciklus vége (end) után elvégzi a beírt kód kiértékelését és eredményét kiírja a szabványos kimenetre.
Meghívása
[szerkesztés]Unix alapú rendszerekben parancssorból az irb paranccsal:
>irb irb(main):001:0> p (1/2).class Fixnum → nil
Nyelvi elemek
[szerkesztés]Osztályok
[szerkesztés]Az osztályok nevét mindig nagybetűvel kell kezdeni, mivel konstansoknak számítanak
Példa osztály létrehozására:
class HelloClass
def koszontes
puts "Helló világ!"
end
end
HelloClass::koszontes()
Minden létrehozott osztály egy ősosztályból, az Object-ből származik, így örökli ezen metódusait. Érdekesség, hogy minden osztály objektum is önmagában így lehetnek singleton metódusai, amelyeket az osztály objektum-példányai nem érhetnek el.
class HelloClass
def self.koszontes
puts "Üdvözöl a ruby nyelv!"
end
end
HelloClass.koszontes() → "Üdvözöl a ruby nyelv!"
HelloClass.new().koszontes() → NoMethodError
Példányosítás, objektumok létrehozása
[szerkesztés]Az osztályok konstruktorának mindig az initialize
metódus számít:
class CreateObject
def initialize
puts "Objektum létrehozása"
end
end
Objektum létrehozása a new()
metódussal.
A fenti példánál maradva:
A = CreateObject.new() → "Objektum létrehozása"
Osztálymetódusok létrehozása, meghívása
[szerkesztés]A létrehozott osztályunk metódusai alapesetben példányosítás nélkül nem hívhatóak meg, ezt írhatjuk felül a metódus elé tett 'self.' jelölővel:
class InkrementaloOsztaly
def self.inkrementald szam
szam += 1
end
end
puts InkrementaloOsztaly.inkrementald(5) → 6
Osztályok kibővítése, metódusok felülbírálása
[szerkesztés]A Ruby dinamizmusának alapját jelenti, hogy az osztályok nyitottak.
class A
def self.b
puts "valami"
end
end
A.b → "valami"
class A
def self.b
puts "inkabb mas"
end
end
A.b → "inkabb mas".
Feltételes szerkezetek, ciklusok
[szerkesztés]If (ha)
[szerkesztés]A más nyelvekben megszokotthoz hasonlóan is lehet használni, pl:
if a < b then
c = -1
elsif a == b
c = 0
else
c = 1
end
Szintaktikai jellemzők:
- a feltételvizsgálatot nem kötelező zárójelbe tenni, persze ha összetett, az egyértelműség kedvéért érdemes csoportosítani
- a
then
szót nem kötelező kiírni, csak akkor, ha a végrehajtandó utasítás azonos sorban van (azend
ekkor is kötelező)
Megjegyzés: a fenti példa kizárólag didaktikai célra használandó. Ugyanis ugyanezt a tevékenységet elvégzi a <=>
összehasonlító operátor is, amely három értéket adhat vissza (-1, ha a bal oldal kisebb, 0, ha egyenlő, 1, ha nagyobb).
1 <=> 0 → 1
1 <=> 1 → 0
1 <=> 2 → -1
Alternatív használat: a feltételt a végrehajtandó utasítás után is írhatjuk!
puts 'de jó' if 1 > 0
Eredmény:
de jó
Ha arra van szükségünk, a feltételvizsgálat értéket is tud visszaadni, például:
kimenet = if a < b then
-1
elsif a == b
0
else
1
end
Ha viszont csak ha-különben esettel van dolgunk, van ennek egy rövidített formája is hasonlóan a C, C++, Java és Perl nyelvekhez:
kimenet = a < b ? a : b
A feltételt a kérdőjel (?) zárja, a két lehetséges értéket pedig egy kettőspont (:) választja el, ezen belül persze bármilyen kifejezés szerepelhet, ami kimenetet produkál, akár függvényhívás is.
Unless (ha nem)
[szerkesztés]Létezik az if
fordítottja is, az unless
is. Ez értelemszerűen akkor fut le, ha a vizsgált kifejezés hamis. Példák:
unless 1 < 2
er = 1
else
er = 2
end
A unless
után is használhatjuk a then
-t, ha ugyanabban a sorban akarjuk folytatni (egyébként nem kötelező).
kim = unless 1 < 0 then 1 else 2 end
Nyilván az unless is használható az utasítás után.
a = 1 unless a == 1
Ez persze ekvivalens ezzel:
a = 1 if a != 1
While (amíg)
[szerkesztés]Amíg a feltétel igaz, végrehajtja a ciklusmagot. Szerkezete igen egyszerű:
a = 0
while a < 10
a += 1
puts a
end
→ 1 2 3 4 5 6 7 8 9 10
Alkalmazások
[szerkesztés]Twitter – a Twitter Web interfész Ruby on Rails keretrendszert (framework) használ,[1] ami egy Ruby Enterprise Edition nevű Ruby-verzió felett működik.[2]
2007-től 2008-ig az üzeneteket egy Starling nevű Ruby-ban írt perzisztens queue server kezelte, ám 2009-től ezt a feladatot fokozatosan átveszi egy Scala programozási nyelven írt alkalmazás.
YellowPages.com, scribd.com, hulu.com – ezek a nagy forgalmú közösségi portálok is Ruby nyelven alapuló motort használnak.[3] A Hulu eredetileg a Merb [1] nevű motort használta, ami paramétereiben jobb volt, mint a Ruby on Rails 2-es változata. A Merb-et később beolvasztották a Rails3 rendszerbe.
Kritika
[szerkesztés]A nyelvvel szemben felmerült főbb érvek:
- A nyelvnek nincs formális definíciója.
- A Ruby nyelv 1.8 és 1.9 verziójában inkompatibilis módon megváltozott a nyelv szintaxisa. Ez azt jelzi, hogy a Ruby nyelv tervezés híján, ad hoc módon fejlődik.
- A nyelv és az interpreter nem kiforrott, túl fiatal, sok hibát hordozhat (mindkettő).
- A Ruby interpreter a leglassúbbak közé tartozik.[4][5]
- A Ruby egyszerűen egy divatjelenség (hype).[6]
- Kicsi a felhasználói tábor, kevés a konzultációs lehetőség és a dokumentáció, a támogatás hiánya.
- 'Még egy OO szkriptnyelv' érv: a létező nyelvek elég kiforrottak, rendelkeznek minden lehetőséggel, amit a Ruby és a Ruby on Rails framework tartalmaz, ill. a Ruby környezet nem rendelkezik olyan előnnyel, ami miatt abban kéne alkalmazásokat fejleszteni.
További írások:
- Is Ruby’s Popularity Fading?; Josh Catone, 2009. – benne: összehasonlítás, 2001-2010.
- Derek Sivers: „7 reasons I switched back to PHP after 2 years on Rails” (angolul) – 7 érv a Ruby használata ellen (2007).
- Ruby vs Java Conundrum (angolul) – Ruby / Java összehasonlítás, előnyök és hátrányok, Vineet Tyagi, 2007.
- What’s Wrong With Ruby? (angolul); Matthew Huntbach, 2007.
Jegyzetek
[szerkesztés]- ↑ Gomes, Lee: The Pied Piper of Pay. Forbes, 2009. június 22. (Hozzáférés: 2009. június 16.)
- ↑ ryan king: Twitter on Ruby, 2009. szeptember 25. (Hozzáférés: 2009. október 31.) „We recently migrated Twitter from a custom Ruby 1.8.6 build to a Ruby Enterprise Edition release candidate, courtesy of Phusion. Our primary motivation was the integration of Brent's MBARI patches, which increase memory stability.”
- ↑ Yehuda Katz: Stop Watching Sophie’s Choice (And Get Some Work Done), 2008. november 25. [2010. május 8-i dátummal az eredetiből archiválva]. (Hozzáférés: 2010. augusztus 17.) „... many large web applications, including YellowPages.com, scribd.com, and hulu.com, not exactly tiny web sites, are running on infrastructures that depend on this “outdated” interpreter.”
- ↑ Archivált másolat. [2010. augusztus 14-i dátummal az eredetiből archiválva]. (Hozzáférés: 2010. augusztus 16.)
- ↑ Archivált másolat. [2008. május 9-i dátummal az eredetiből archiválva]. (Hozzáférés: 2010. augusztus 16.)
- ↑ http://www.infoq.com/news/2007/10/ruby-hype-cycle
Külső hivatkozások
[szerkesztés]- A Ruby honlapja (angolul)