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! |
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.
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 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ésA 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ésLinux
szerkesztésA 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ésLe kell tölteni a telepítőállományt és futtatni kell.
Mac OSX
szerkesztésFeltelepítve tartalmazza az operációs rendszer.
IRB - az Interaktív Ruby Shell
szerkesztésGyors é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ésUnix alapú rendszerekben parancssorból az irb paranccsal:
>irb irb(main):001:0> p (1/2).class Fixnum → nil
Nyelvi elemek
szerkesztésOsztályok
szerkesztésAz 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ésAz 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ésA 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ésA 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ésIf (ha)
szerkesztésA 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ésLé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ésAmí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ésTwitter – 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ésA 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)