Ugrás a tartalomhoz

Ruby (programozási nyelv)

A Wikipédiából, a szabad enciklopédiából
A lap korábbi változatát látod, amilyen Viloris (vitalap | szerkesztései) 2021. április 2., 09:39-kor történt szerkesztése után volt. Ez a változat jelentősen eltérhet az aktuális változattól. (korr)
Ruby

Paradigmatöbbelvű
Jellemző kiterjesztés
  • rb
  • rbw
Megjelent1995
TervezőMacumoto Jukihiro
FejlesztőMacumoto Jukihiro (és mások)
Utolsó kiadás2.1.1 (2014. február 24.)
TípusosságErősen típusos programozási nyelv, dinamikus típusok, (Duck typing)
FordítóprogramRuby MRI, JRuby
Hatással volt ráSmalltalk, Perl, Lisp, Scheme, Python, CLU, Eiffel, Ada, Dylan
Befolyásolt nyelvekGroovy, Nu
Operációs rendszerPlatformfüggetlen
LicencRuby 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

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

Linux

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

Le kell tölteni a telepítőállományt és futtatni kell.

Mac OSX

Feltelepítve tartalmazza az operációs rendszer.

IRB - az Interaktív Ruby Shell

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

Unix alapú rendszerekben parancssorból az irb paranccsal:

>irb
irb(main):001:0> p (1/2).class
Fixnum
→ nil

Nyelvi elemek

Osztályok

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

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

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

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

If (ha)

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 (az end 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)

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)

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

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

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:

Jegyzetek

  1. Gomes, Lee: The Pied Piper of Pay. Forbes, 2009. június 22. (Hozzáférés: 2009. június 16.)
  2. 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.”
  3. 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.”
  4. Archivált másolat. [2010. augusztus 14-i dátummal az eredetiből archiválva]. (Hozzáférés: 2010. augusztus 16.)
  5. Archivált másolat. [2008. május 9-i dátummal az eredetiből archiválva]. (Hozzáférés: 2010. augusztus 16.)
  6. http://www.infoq.com/news/2007/10/ruby-hype-cycle

Külső hivatkozások