|
|
Riadok 8: |
Riadok 8: |
| |Mechatronika | | |Mechatronika |
| }} | | }} |
| + | <div class="sideBox"> |
| + | {| class="" border=0 cellpadding=5 |
| + | |+ Obsah práce |
| + | |- |
| + | | 1. |
| + | | [[Pokročilé vlastnosti skiptovacích jazykov| Úvod do Ruby on Rails]] |
| + | |- |
| + | | 2. |
| + | | [[Pokročilé vlastnosti skiptovacích jazykov_2| Ruby]] |
| + | |- |
| + | | 3. |
| + | | [[Pokročilé vlastnosti skiptovacích jazykov_3|Porovnanie Ruby a PHP]] |
| + | |- |
| + | | 4 |
| + | | [[Pokročilé vlastnosti skiptovacích jazykov_4|Ruby on Rails]] |
| + | |- |
| + | | 5 |
| + | | [[Pokročilé vlastnosti skiptovacích jazykov_5|Praktická aplikácia využívajúca Rails ]] |
| | | |
| + | |- |
| + | | 6 |
| + | | [[Pokročilé vlastnosti skiptovacích jazykov_6|Záver]] |
| + | |} |
| + | </div> |
| {{abstrakt | | {{abstrakt |
| |Popis jazyka Ruby a porovnanie syntaxe Ruby s jazykom PHP. Charakterizácia frameworku Ruby on Rails a jeho základné moduly pre prácu s databázami. Teoretický popis vytvárania relácií v Rails. Praktická ukážka pomocou zobrazenia rozvrhu podľa zvolených požiadaviek a ukážkový benchmark porovnávajúci Rails a PHP. Informácie o iných porovnávacích benchmarkoch. | | |Popis jazyka Ruby a porovnanie syntaxe Ruby s jazykom PHP. Charakterizácia frameworku Ruby on Rails a jeho základné moduly pre prácu s databázami. Teoretický popis vytvárania relácií v Rails. Praktická ukážka pomocou zobrazenia rozvrhu podľa zvolených požiadaviek a ukážkový benchmark porovnávajúci Rails a PHP. Informácie o iných porovnávacích benchmarkoch. |
Riadok 51: |
Riadok 74: |
| | | |
| '''Convention over Configuration''' – Konvencia nad konfiguráciou – Ide o jednu z rozhodujúcich čŕt Ruby on Rails. Hlavným zámerom je, aby programátor nemusel zakaždým písať pre novú aplikáciu ten istý kód, ktorý je konvenčne rovnaký pre drvivú väčšinu aplikácií. Nasledovaním konvencií tak môže pomocou pár príkazov jednoducho vytvoriť základnú kostru aplikácie, ktorú potom nakonfiguruje podľa svojich potrieb. | | '''Convention over Configuration''' – Konvencia nad konfiguráciou – Ide o jednu z rozhodujúcich čŕt Ruby on Rails. Hlavným zámerom je, aby programátor nemusel zakaždým písať pre novú aplikáciu ten istý kód, ktorý je konvenčne rovnaký pre drvivú väčšinu aplikácií. Nasledovaním konvencií tak môže pomocou pár príkazov jednoducho vytvoriť základnú kostru aplikácie, ktorú potom nakonfiguruje podľa svojich potrieb. |
− |
| |
− | =Ruby=
| |
− | ==Ruby ako interpretovaný objektovo orientovaný jazyk==
| |
− | Ruby je programovací jazyk, ktorý vytvoril Yukihiro Matsumoto, s cieľom poskytnúť tvorivý spôsob programovania. Matsumuto chcel vytvoriť jazyk, s ktorým bude radosť pracovať a ktorý bude čo najprirodzenejší. Typickým príkladom je výpis pozdravu hello world:
| |
− | <source lang="ruby">
| |
− | puts ”Hello world!”
| |
− | </source>
| |
− | Príkaz znamená vypíš reťazec Hello world – v angličtine put string Hello world...
| |
− | Prvou a základnou vecou, ktorú treba pri jazyku Ruby pochopiť, aby sme s ním mohli plnohodnotne pracovať je to, že ide o interpretovaný a absolútne objektvo orientovaný jazyk.
| |
− | Interpretované (skriptovacie) jazyky sú jazyky, ktoré su prekladané pomocu interpreteru až počas behu programu. Sú pomalšie ako kompilované jazyky, ale nemajú tak veľké formálne požiadavky (nie je potreba inicializovať premennú, jej dátový typ sa môže počas behu meniť, ukazovatele sú zbytočné).
| |
− | Mnoho iných interpretovaných jazykov, ako napríklad PHP alebo Java podporujú objektovo-orientované programovanie, avšak nie sú absolútne objektovo orientované. Je to preto, že tieto jazyky obsahujú tzv. primitívne typy, napríklad integer, float, string, boolean, ktoré slúžia na ukladanie dát, ale nie sú objektami.
| |
− |
| |
− | Ruby je od týchto jazykov radikálne odlišné, pretože neobsahuje žiadne z týchto primitívnych typov. Ide o čisto objektovo orientovaný jazyk, takže všetko je objekt v absolútnom slova zmysle.
| |
− | Základnou myšlienkou objektovo orientovaného programovania (OOP) je, že program by mal byť zložený zo samostatných entít, objektov, pričom každý z nich je schopný komunikovať s ostatnými objektami. Každý objekt je teda zložený z metód (volateľného kódu, ktorý vykonáva určitú činnosť) a interne uložených dát. Táto metóda „zabalenia“ užitočných vecí do objektu sa nazýva zapuzdrefinie.
| |
− | Objekty v aplikácii OOP sú často prirovnateľné k objektom reálneho sveta, čo umožňuje ľašie pochopenie funkcie a postavenia objektov v programe. A rovnako ako v reálnom svete, objekty môžu byť začlenené podľa rôznych kritérií do tried. To znamená, že triedy sú typom objektu. Tak napríklad, číslo 1 je objektom triedy ''Fixnum'' a medzi jej metódy patrí napríklad metóda + , teda súčet. Tak isto nami vytvorený objekt ''Trabant'' môže patriť do triedy ''auto'' a obsahovať metódu ''zapni_motor''.
| |
− |
| |
− | Pochopenie vzťahov medzi triedami, objektami a metódami umožňuje zistiť, ako OOP funguje. Objekt z jednej triedy môže napríklad vyvolať akciu iného objektu inej triedy, bez ovplyvnenia stavu ďalších objektov v tej istej triede. Tiež môžeme zmeniť určitú vlastnosť objektu bez toho, aby to malo vplyv na iné objekty tej istej triedy – keďže objekt sa správa ako samostatná entita. Každý nový objekt je vytváraný z určitej triedy, z ktorej vychádza – tento proces je nazývaný aj konktretizácia. Vytvorené objekty medzi sebou môžu komunikovať a vyvolávať metódy, spôsobom otázok a odpovedí. V prípade OOP sú otázkami inštrukcie a odpoveďami návratová hodnota, resp. stavová správa indikujúca, či bola požadovaná inštrukcia úspešne vykonaná. Tak v našom príklade môže objekt ''šofér'' požadovať inštrukciu ''zapni_motor'' od objektu ''Trabant'', pričom návratovou hodnotou môže byť informácia o úspešnom alebo neúspešnom naštartovaní motora.
| |
− |
| |
− | Keďže Ruby je absolútne objektovo orientovaný, čokoľvek v ňom je buď objektom, triedou alebo metódou určitého objektu a tak budeme aj pristupovať k informáciám v nasledujúcich podkapitolách, či pôjde o čísla, textové reťace alebo polia. Spomenuté výrazy si postupne rozoberieme v nasledujúcom texte.
| |
− |
| |
− | ==Inštalácia a vývojové prostredie Ruby==
| |
− | Ruby na OS Windows nainštalujeme stiahnutím kompletného inštalátora Ruby z adresy http://rubyinstaller.rubyforge.org a jeho následným nainštalovaním. Na všetkých novších verziách Mac OS X a Linux je Ruby nainštalovaný automaticky.
| |
− | Pre prácu s Ruby je dostačujúci akýkoľvek textový editor, napríklad WordPad alebo Poznámkový blok, pričom výsledný Ruby program je potrebné uložiť s príponou .rb . Tento je potom spustiteľný z príkazového riadku.
| |
− |
| |
− | Ďalšou možnosťou práce s Ruby je rozhranie IRB (Interactive Ruby Shell), pre ktorého spustenie stačí napísať irb do príkazového riadku. IRB rozhranie umožňuje interaktívne poskytnúť výsledok nášho príkazu, takže je ideálny pre testovanie jednoduchých jednoriadkových príkazov – preto ho budeme občas používať aj v nasledujúcich príkladoch.
| |
− |
| |
− | ==Čísla, reťazce, premenné a konštanty==
| |
− | Ruby podporuje ako celé čísla (integer), tak i čísla s desatinnou čiarkou(float), pričom veľkosť celých čísel v ňom nie je nijako obmedzená – jediným obmedzením je teda voľná pamäť počítača. Čísla v rozmedzí od -2<sup>30</sup> do 2<sup>30</sup>-1 alebo -2<sup>62</sup> do 2<sup>62</sup>-1 sú zaradené do triedy ''Fixnum'', ostatné presahujúce daný rozsah sú triedy ''Bignum''. Presvedčiť sa o tom môžeme jednoduchým príkazom:
| |
− | <source lang="ruby">
| |
− | irb> 1
| |
− | => 1
| |
− | </source>
| |
− | V tomto príklade sa môže zdať, že sme dostali identický výstup od vstupu. A predsa tomu nie je tak. Výstupom je novovytvorený plnohodnotný Ruby objekt. Volaním metódy class môžeme ľahko zistiť, do ktorej triedy patrí naše číslo 1:
| |
− | <source lang="ruby">
| |
− | irb> 1.class
| |
− | => Fixnum
| |
− | </source>
| |
− | Výsledok je jasný, každý objekt je priradený do svojej triedy.
| |
− | Ruby sa o to najnutnejšie postará sám, okrem toho umožňuje veľké čísla zapísať oddelené podtržítkami pre sprehľadnenie, napríklad:
| |
− | <source lang="ruby">
| |
− | irb>100_111_222_333_444
| |
− | =>100111222333444
| |
− | </source>
| |
− | Desatinné čísla sa dajú písať s vložením desatinnej čiarky, napríklad 3,1415, alebo s exponentom 31415.0e-4. Môžeme písať aj čísla binárne, zapísaním 0b na začiatok, osmičkové s 0 na začiatku a hexadecimálne s pomocou predpony 0x. Zadané vstupy teda odpovedajú nasledovným výstupom:
| |
− | <source lang="ruby">
| |
− | irb>0b10101
| |
− | =>21
| |
− | irb>0134
| |
− | =>668
| |
− | irb>0xa321c
| |
− | =>668188
| |
− | </source>
| |
− | ===Reťazce===
| |
− | Reťazce sa môžu uzavrieť do apostrofov (``) alebo úvodzoviek (””),takže výrazy ”Ahoj” a `Ahoj` sú identické. Ak chceme použiť apostrofy alebo úvodzovky v texte, môžeme ich kombinovať, alebo môžeme v texte miesto nich vložiť %q (apostrofy) alebo %Q (úvodzovky) spolu s jediným znakom a na mieste ukončenia daný znak. Rovnaký efekt bude mať použitie dvojice znakov { a }, popr. < a >, dokonca môžeme vypustiť znak Q. Takže nasledujúce výrazy sú ekvivalentné:
| |
− | <source lang="ruby">
| |
− | irb>”Povedal: `Ahoj!`”
| |
− | irb>”Povedal: %q/Ahoj!/”
| |
− | irb>”Povedal: %q{Ahoj!}”
| |
− | irb>”Povedal: %q<Ahoj!>” # výpis bude vždy: Povedal: `Ahoj!`
| |
− | </source>
| |
− | Reťazce sa spájajú znakom +, napríklad:
| |
− | <source lang="ruby">
| |
− | irb>“jedna, “ + “dva, ” + “tri”
| |
− | =>”jedna, dva, tri”
| |
− | </source>
| |
− | Volaním metódy length zistíme dĺžku daného reťazca – objektu:
| |
− | <source lang="ruby">
| |
− | irb>“jedna, dva, tri”.length
| |
− | =>15
| |
− | </source>
| |
− | Výsledok určitého matematického výpočtu v reťazci zobrazíme jeho ohraničením do znakov #{ a }, napríklad:
| |
− | <source lang="ruby">
| |
− | irb>“5+7 je po scitani #{5+7}”
| |
− | =>”5+7 je po scitani 12”
| |
− | </source>
| |
− |
| |
− | ===Premenné===
| |
− |
| |
− | Ruby dokáže ukladať dáta v premenných, čo sú pomenovaní zástupcovia predstavujúci nejaké čísla, reťazce a ďalšie údaje. Na tieto dáta uložené v premennej na odkazuje použitím názvu danej premennej. Premenné začínajú malým znakom a-z alebo podčiarkovníkom _ , potom nasleduje ľubovoľný počet znakov názvu – môže to byť malé i veľké písmeno, číslo, podčiarkovník. Jedinou podmienkou je nepoužívať slová, ktoré pre seba rezervuje jazyk Ruby, napríklad výrazy vyjadrujúce podmienky (''if, then, when, else, elseif..''), pravdivostnú hodnotu (''true, false'') alebo ohraničenie skupiny príkazov (''begin, end'').
| |
− |
| |
− | Krátky príklad definovania a práce s premennou teplota:
| |
− | <source lang="ruby">
| |
− | irb>teplota=20
| |
− | =>20
| |
− | irb>”Teplota je ”+String(teplota)
| |
− | =>”Teplota je 20”
| |
− | irb>teplota=teplota+5
| |
− | =>25
| |
− | irb>”Aktualna teplota je #{teplota}”
| |
− | =>”Aktualna teplota je 25”
| |
− | </source>
| |
− | Z príkladu vidno, že ak chceme k reťazcu priradiť číslo, je potrebné použiť metódu String, alebo ohraničiť prennú znakmi #{ a }. Ekvivalentom metódy String je metóda to_s:
| |
− | <source lang="ruby">
| |
− | irb>”Teplota je ”+teplota.to_s
| |
− | =>”Teplota je 25”
| |
− | </source>
| |
− |
| |
− | ====Globálne premenné====
| |
− | Globálne premenné sú premenné platné v celom programe a začínajú znakom $:
| |
− | <source lang="ruby">
| |
− | $x, $datum, $abc_DEF
| |
− | </source>
| |
− | ====Premenné inštancií====
| |
− | Premenné začínajúce znakom @ sú premenné inštancií (inštancie) :
| |
− | <source lang="ruby">
| |
− | @x, @datum, @abc_DEF
| |
− | </source>
| |
− | Premenné inštancií na rozdiel od lokálnych premenných zachovávajú hodnoty do nich uložené, pokiaľ existuje ich príslušný objekt.
| |
− |
| |
− | ====Konštanty====
| |
− | V Ruby je tiež možné vytvárať konštanty. Konštanta obsahuje určitú hodnotu, ktorá ostáva časovo nemenná. Každá konštanta začína veľkým písmenom, ktorým Ruby rozpozná, že sa jedná o konštantu. Konštanty umožňuje Ruby zmeniť, v takom prípade sa zobrazí upozornenie o tom, že daná konštanta bola už inicializovaná.
| |
− | <source lang="ruby">
| |
− | irb>TRPASLIKOV= 7
| |
− | =>7
| |
− | </source>
| |
− |
| |
− | ==Symboly, polia a hash==
| |
− | ===Symboly===
| |
− | (v iných jazykoch nazývané atómy) sú podobné reťazcom. Môžu obsahovať znaky, čísla, podčiarkovník, ale začínajú dvojbodkou:
| |
− | <source lang="ruby">
| |
− | :a, :b2, :agent_007
| |
− | </source>
| |
− | Symboly sa používajú na ukladanie raťazcov, keď nie je požadovaný výstup na obrazovku; v kóde nedochádza k ich náhrade.
| |
− | ===Polia===
| |
− | Polia predstavujú skupiny premenných rôznych typov ku ktorým je možné pristupovať prostredníctvom indexu:
| |
− | <source lang="ruby">
| |
− | pole=[“a”,“b”,14,“zelena”]
| |
− | puts pole[2] # vypíše 14
| |
− | pole[3,1]=”modra” #nahradí 1 element od pozície 3 reťazcom modrá
| |
− | puts pole #výpis bude: [”a”, ”b”, 14, ”modra”]
| |
− | </source>
| |
− | ===Hash (asociačné polia)===
| |
− | Hash je pole, ku ktorého premenným možno pristupovať namiesto indexov prostredníctvom textových reťacov. K jeho vytvoreniu sa používajú zložené zátvorky:
| |
− | <source lang="ruby">
| |
− | kolko_dni_ma_mesiac = { ”januar” => 31, ”februar” => 28, ”marec” =>31}
| |
− | kolko_dni_ma_mesiac[”februar”] # vypíše 28
| |
− | </source>
| |
− | ==Podmienené výrazy, cykly, metódy a bloky==
| |
− | V nasledujúcich príkladoch je zobrazený obecný syntax príkazov vrátane voliteľných klauzulí (tieto nepovinné klauzule sú ohraničené hranatými zátvorkami):
| |
− | '''if :'''
| |
− | <source lang="text">
| |
− | if logický_výraz [then | :]
| |
− | kód1
| |
− | [elseif
| |
− | kód2]
| |
− | [else
| |
− | kód3]
| |
− | end
| |
− | </source>
| |
− |
| |
− | ''' unless:'''
| |
− | <source lang="text">
| |
− | unless logický_výraz [then | :]
| |
− | kód1
| |
− | [else
| |
− | kód2 ]
| |
− | end
| |
− | </source>
| |
− |
| |
− | '''case:'''
| |
− | <source lang="text">
| |
− | case hodnota
| |
− | when výraz [, porovnanie]… [then | :]
| |
− | kód1
| |
− | when výraz [, porovnanie]… [then | :]
| |
− | kód2
| |
− | ...
| |
− | [else
| |
− | kód]
| |
− | end
| |
− | </source>
| |
− |
| |
− | '''Ternárny operátor:'''
| |
− | <source lang="text">
| |
− | výsledok = podmienka ? pravdivá_hodnota : nepravdivá_hodnota
| |
− | </source>
| |
− |
| |
− | '''while:'''
| |
− | <source lang="text">
| |
− | while podmienka [do | :]
| |
− | kód
| |
− | end
| |
− | </source>
| |
− |
| |
− | '''until:'''
| |
− | <source lang="text">
| |
− | until podmienka [do | :]
| |
− | kód
| |
− | end
| |
− | </source>
| |
− |
| |
− | '''for:'''
| |
− | <source lang="text">
| |
− | for premenná [, premenná...] in kolekcia [do | :]
| |
− | kód
| |
− | end
| |
− | </source>
| |
− |
| |
− | ===Iterátory jazyka Ruby===
| |
− | Okrem definovaných cyklov podporuje Ruby iterátory, metódy vstavané do položiek, s ktorými sa pracuje. Umožňujú vytvárať cykly a nahrádzať častokrát cykly komplikovanejšie.
| |
− | Metóda ''upto/downto'' (hore/dole po) vytvára cyklus pokračujúci až do zadanej hodnoty (vrátane):
| |
− | <pre>
| |
− | hodnota1.upto/downto(hodnota2) do |index_cyklu|
| |
− | kód
| |
− | end
| |
− | </pre>
| |
− | Iterátor step zvyšuje index cyklu o zadanú hodnotu:
| |
− | <pre>
| |
− | hodnota1.step(hodnota2, hodnota_kroku) do |aktualna_hodnota|
| |
− | kód
| |
− | end
| |
− | </pre>
| |
− |
| |
− | Presný počet cyklov vykonáva iterátor times:
| |
− | <pre>
| |
− | hodnota.times do
| |
− | kód
| |
− | end
| |
− | </pre>
| |
− | ===Break, redo a next v cykloch===
| |
− | Existujú 3 kľúčové slová využiteľné v súvislosti s cyklami a iterátormi: ''break, redo'' a ''next''.
| |
− | ''Break'' okamžite ukončuje daný cyklus (ten, v ktorom sa nachádza).
| |
− | ''Redo'' opakuje iteráciu aktuálneho cyklu (bez toho aby došlo k novému vyhodnoteniu podmienky cyklu alebo prevzatiu nasledujúcej položky z nejakého iterátora)
| |
− | ''Next'' preskakuje na koniec aktuálnej iterácie (tkaže cyklus alebo iterátor preskočí na ďalšiu iteráciu alebo položku).
| |
− | ===Metódy===
| |
− | Metódy slúžia na vykonávanie požadovaných inštrukcií a obvykle sa pripájajú na koniec premenných a konštánt bodkou (.). Napríklad:
| |
− | <pre>
| |
− | svetlo.zapni
| |
− | </pre>
| |
− | Použili sme metódu zapni. Metód môže byť viac za sebou:
| |
− | <pre>
| |
− | svetlo.zapni.vypni.je_vypnute?
| |
− | </pre>
| |
− | V tomto príklade sa najprv svetlo zapne, následne vypne a posledná metóda výstupom potvrdí, či je svetlo vypnuté.
| |
− | Niektoré metódy požadujú ďalšie informácie, vstupné hodnoty, pre vykonanie inštrukcií. Tieto sa nazývajú argumenty. Argumenty sa pripájajú za metódu ohraničené do zátvoriek a oddelené čiarkou:
| |
− | <pre>
| |
− | svetlo.zapni(2, :minuta)
| |
− | </pre>
| |
− | Metóda zapne 2. svetlo v poradí na 1 minútu.
| |
− | Niektoré metódy sú tzv. ''kernel'' metódy, metódy bežne používané Ruby, preto pred ne netreba pridávať bodku:
| |
− | <pre>
| |
− | print “Nepotrebujem bodku pred metódu print.“
| |
− | </pre>
| |
− |
| |
− | Okrem preddefinovaných metód si môžeme vytvoriť aj vlastné, napríklad:
| |
− | <source lang="ruby">
| |
− | def pozdrav
| |
− | puts ”Hello world!”
| |
− | end
| |
− | </source>
| |
− |
| |
− | Metódu následne zavoláme zadaním jej názvu.
| |
− |
| |
− | ===Bloky===
| |
− | Blok je časť kódu vymedzená znakmi {} alebo slovami do a end. Možno ho poskytnúť metóde podobne ako argument. Pre tento účel slúži príkaz yield:
| |
− | <source lang="ruby">
| |
− | def pozdrav
| |
− | yield
| |
− | end
| |
− |
| |
− | pozdrav { puts “Hello world!“ }
| |
− | </source>
| |
− | Výsledkom daného kódu je:
| |
− | <pre>
| |
− | Hello world!
| |
− | </pre>
| |
− | Príkaz yield je možné vykonať aj viackrát. Dáta možno blokom poskytovať pomocou príkazu yield, ktoré sa v bloku načítajú podobne ako agrumenty poskytnuté metóde:
| |
− | <source lang="ruby">
| |
− | def pozdrav
| |
− | yield “Hello“ “world!“
| |
− | end
| |
− |
| |
− | pozdrav {slovo_jedna, slovo_dva | puts slovo_jedna + “ “ + slovo_dva}
| |
− | </source>
| |
− |
| |
− | ==Triedy a jej premenné, objekty, moduly==
| |
− |
| |
− | ===Prístup k objektom jazyka Ruby===
| |
− | Jazyk Ruby ponúka 3 úrovne prístupu k metódam:
| |
− | Verejné metódy je možné volať z každého miesta kódu, nemajú žiadne obmedzenia.
| |
− | Chránené metódy možno volať iba vnútri objeku tej triedy, ktorá dané metódy definuje alebo objektov tried odvodených z danej triedy.
| |
− | Súktormné metódy je možné voleť len vnútri aktuálneho objektu.
| |
− | Ruby definuje kľúčové slová (public, protected, private), označované ako modifikátory prístupu.
| |
− |
| |
− | ===Vytváranie premenných triedy===
| |
− | Premenné inštancií sa vytvárajú pridaním predpony @ pred ich názov. Premenné triedy sa dajú vytvoriť pripojením @@ pred názov. Takúto premennú triedy zdieľajú všetky jej inštancie, takže zmena tejto hodnoty v jednom objekte spôsobí zmenu vo všetkých objektoch danej triedy (naproti tomu premenné inštancií sú v objektoch interné).
| |
− | <source lang="ruby">
| |
− | class Ovocie
| |
− | @@pocet_ovocia = 0
| |
− | attr_accessor:farba
| |
− | def initialize(farba)
| |
− | @farba=farba
| |
− | @@pocet_ovocia += 1
| |
− | end
| |
− | end
| |
− | </source>
| |
− | Definovaná premenná triedy @@pocet_ovocia pri každom vytvorení nového objektu triedy Ovocie zvýši hodnotu o 1.
| |
− |
| |
− | ===Vytváranie metód triedy===
| |
− | ===Triedy===
| |
− | Pre vytvorenie triedy slúži príkaz class:
| |
− | <source lang="ruby">
| |
− | class Ovocie # vytvorenie novej triedy
| |
− | def initialize # definovanie metódy initialize
| |
− | @farba=”zlta”
| |
− | end
| |
− |
| |
− | def vypis_farbu # definovanie metódy výpis_farbu
| |
− | return @farba
| |
− | end
| |
− | end
| |
− | </source>
| |
− | V uvedenom príklade sme vytvorili novú triedu Ovocie, v ktorej sme definovali dve metódy: initialize a vypis_farbu. Metóda vypis_farbu slúži na výpis farby ovocia – @farba je už spomínaná premenná inštancií, objekt charakterizujúci danú triedu. Metóda initialize sa automaticky volá, keď sa daná trieda použije na vytvorenie nového objektu. Initialize je špecifická metóda Ruby, nazývaná tiež konštruktor triedy - používa sa na konštrukciu nových objektov. Príklad:
| |
− | <source lang="ruby">
| |
− | class Ovocie
| |
− | def initialize(farba)
| |
− | @farba=farba
| |
− | end
| |
− |
| |
− | def vypis_farbu
| |
− | return @farba
| |
− | end
| |
− | end
| |
− | jablko = Ovocie.new(“cervena“)
| |
− | puts “Farba noveho ovocia je “ + jablko.vypis_farbu
| |
− |
| |
− | # výpisom bude: Farba noveho ovocia je cervena.
| |
− | </source>
| |
− | Ako vidno z príkladu, vytvorili sme nový objekt jablko triedy Ovocie pomocou metódy new. Za metódu new sme pripojili vstupný argument farba, s ktorým následne pracuje metóda initialize pri vytváraní nového objektu.
| |
− | Metóda vypis_farba je nazývaná tiež prístupová metóda, pretože sa používa pre prístup k vnútorným hodnotám určitého objektu. V tomto prípade sa vypis_farba (v spojení jablko.vypis_farba) označuje za atribút. Atribút vypis_farba je čitateľný atribút objektu Ovocie, pretože prostredníctvom neho je možné čítať hodnotu premennej inštancií @farba. Vytvorenie čitateľného atribútu je možné zjednodušiť nasledovne:
| |
− | <source lang="ruby">
| |
− | class Ovocie
| |
− | attr_reader:farba
| |
− | def initialize(farba)
| |
− | @farba=farba
| |
− | end
| |
− | end
| |
− | jablko = Ovocie.new(“cervena“)
| |
− | puts “Farba noveho ovocia je “ + jablko.farba
| |
− | </source>
| |
− | V príklade sme metódu vypis_farbu nahradili príkazom attr_reader, ktorý vytvorí inštanciu s názvom @farba a tiež metódu s rovnomenným názvom. Výsledok príkladu je totožný s predošlým dlhším kódom.
| |
− | Atribúty, ktoré nám umožňujú pristupovať a zapisovať hodnoty do vnútorných inštancií objektov, sa nazývajú zapisovateľné atribúty. Zapisovateľné atribúty sa dajú tiež vytvoriť dvoma spôsobmi: použitím prístupovej metódy nasledovanej znakom = :
| |
− | <source lang="ruby">
| |
− | def farba=(farba)
| |
− | @farba=farba
| |
− | end
| |
− |
| |
− | alebo kratšie pomocou príkazu attr_writer:
| |
− |
| |
− | attr_writer:farba
| |
− | </source>
| |
− | Vytvorenie atribútu, ktorý bude čitateľný a zapisovateľný súčasne, nám umožní príkaz attr_accessor:
| |
− | <source lang="ruby">
| |
− | class Ovocie
| |
− | attr_accessor:farba
| |
− | def initialize(farba)
| |
− | @farba=farba
| |
− | end
| |
− | end
| |
− | jablko = Ovocie.new(“cervena“)
| |
− | puts “Farba ovocia je “ + jablko.farba #vypíše “Farba ovocia je cervena“
| |
− | jablko.farba=”zelena”
| |
− | puts ”Teraz je farba ” + jablko.farba #vypíše “Teraz je farba zelena“
| |
− | </source>
| |
− | ===Dedičnosť===
| |
− | V Ruby môžeme vytvoriť mnoho tried, pričom niektoré môžu byť základom pre tvorbu ďlaších. V takom prípade hovoríme o dedičnosti, kedy trieda vychádzajúca z inej triedy od tejto dedí všetky členy – dáta aj metódy. Pri definícii triedy Jablko, ktorá má dediť vlatnosti triedy Ovocie, ju definujeme nasledovne:
| |
− | <source lang="ruby">
| |
− | class Jablko < Ovocie
| |
− | attr_accessor : druh
| |
− | def initialize (farba, druh)
| |
− | super(farba)
| |
− | @druh=druh
| |
− | end
| |
− | end
| |
− | </source>
| |
− | V príklade je použitá špeciálna metóda super vstavaná do jazyka Ruby. Túto používame vtedy, keď chceme poskytnúť farbu konštruktoru základnej triedy.
| |
− |
| |
− | Metódy triedy sa volajú pomocou mena danej triedy, pred jej použitím nie je potrebné vytvárať žiadny objekt. Toto je výhodné a užitočné najmä v prípadoch, keď nepotrebujeme ukladať dáta, s ktorými pracujeme, keďže v metóde triedy nemožno používať dáta inštancií .
| |
− |
| |
− | ===Vytváranie modulov===
| |
− | Pri väčšom počte tried je užitočné zoskupovať ich do modulov. Modul sa vytvára kľúčovým slovom module. Modul s kódom možno vložiť do jedného súboru:
| |
− | <source lang="ruby">
| |
− | module Matematika
| |
− | def Matematika.sucet(cislo_jedna, cislo_dva)
| |
− | return cislo_jedna + cislo_dva
| |
− | end
| |
− | end
| |
− | </source>
| |
− | Takýto modul uložený napríklad do súboru matematika.rb je možné použiť v iných súboroch príkazom include alebo skráteným príkazom (bez potreby zápisu prípony .rb) require:
| |
− | <source lang="ruby">
| |
− | include `matematika.rb` / require `matematika`
| |
− | puts ”2 + 3 = ” + Matematika.sucet(2,3).to_s #výstup: “2 + 3 = 5“
| |
− | </source>
| |
− | Do modulov je možné ukladať aj triedy, ktoré môžu obsahovať vlastné metódy. K takýmto metódam vnútri tried modulov sa pristupuje pomocou operátora rozlíšenia oboru názvov jazyka Ruby (::) :
| |
− | <source lang="ruby">
| |
− | module Matematika
| |
− | class Scitac
| |
− | def Scitac.sucet(cislo_jedna, cislo_dva)
| |
− | return cislo_jedna + cislo_dva
| |
− | end
| |
− | end
| |
− | end
| |
− |
| |
− | require `matematika`
| |
− | puts ”2 + 3 = ”+ Matematika::Scitac.sucet(2,3).to_s
| |
− | </source>
| |
− | Výsledok bude totožný ako v predošlom príklade.
| |
− |
| |
− | =Porovnanie Ruby a PHP=
| |
− | V tejto kapitole uvedieme základné rozdiely, ako aj zhody medzi jazykom Ruby a PHP. Hlavnou odlišnosťou Ruby od PHP je, že Ruby je čisto objektovo orientovaný, takže všetko je objektom, zatiaľ čo PHP používa primitívne dátové typy. Ruby je taktiež na rozdiel od PHP dynamickým jazykom, čo je podľa mnohých výhodou a pre iných nevýhodou (častokrát pre programátorov PHP). Pri statických jazykoch, ako PHP, nie je možné zmeniť už nadefinovanú triedu zásahom „zvonku“. V Ruby je naopak možné triedy a metódy za behu meniť, pridávať, upravovať.
| |
− | ==Syntax==
| |
− | Syntax Ruby má tiež určité odlišnosti, vychádzajúce z jeho filozofie. Patrí sem napríklad spôsob oddelenia inštrukcií – kým PHP sa príkazy oddeľujú vždy bodkočiarkou, v Ruby používame bodkočiarku iba v prípade, že chceme napísať viac príkazov v jednom riadku, inak sa nepoužívajú. Príklad:
| |
− |
| |
− | PHP:
| |
− | <source lang="php">
| |
− | print "Instrukcia";
| |
− | print "Nasledujuca instrukcia"; print "Dalsia instrukcia";
| |
− | </source>
| |
− | Ruby:
| |
− | <source lang="ruby">
| |
− | print "Instrukcia"
| |
− | puts "Nasledujuca instrukcia" ; puts "Dalsia instrukcia"
| |
− | </source>
| |
− |
| |
− | Ďalšie porovnanie základnej syntaxe je zhrnuté v nasledujúcej tabuľke:
| |
− | {|border="2" cellspacing="0" cellpadding="4" width="95%" class="datatable"
| |
− | |+Tabuľka 3.1.: Základná syntax jazyka PHP a Ruby
| |
− | |-
| |
− | |bgcolor = "#B6DDE8"|
| |
− | |bgcolor = "#B6DDE8"|PHP
| |
− | |bgcolor = "#B6DDE8"|Ruby
| |
− |
| |
− | |-
| |
− | |zalomenie riadku
| |
− | |print 1 <nowiki>+</nowiki> 2<br><nowiki>+</nowiki> 3;
| |
− | |print 1 <nowiki>+</nowiki> 2 \<br> <nowiki>+</nowiki> 3
| |
− |
| |
− | |-
| |
− | |komentáre
| |
− | |<nowiki>#</nowiki> komentár1<br>// komentár2<br>/* komentár na viac riadkov */
| |
− | |<nowiki>#</nowiki> komentár1<br>=begin<br>komentár na viac riadkov<br>=end
| |
− |
| |
− | |-
| |
− | |čísla s desatinnou<br>čiarkou
| |
− | |$a = 2.3;<br>$b = .5;<br>$c = 2e-5;
| |
− | |a = 2.3<br>b = 0.5<br>c = 2e-5
| |
− |
| |
− | |}
| |
− |
| |
− | ==Znaky==
| |
− | Ruby aj PHP používajú sadu 256 znakov a z hľadika substitúcie znakov v jednoduchých i dvojitých úvodzovkách sú si veľmi podobné, čo ukazuje aj tabuľka 3.2:
| |
− | {|border="2" cellspacing="0" cellpadding="4" width="94%" class="datatable"
| |
− | |+Tabuľka 3.2.: Substitúcia znakov pri dvojitých úvodzovkách
| |
− | |-
| |
− | |bgcolor = "#B6DDE8"|
| |
− | |bgcolor = "#B6DDE8"|PHP
| |
− | |bgcolor = "#B6DDE8"|Ruby
| |
− | |-
| |
− | |zalomenie riadku
| |
− | |\n
| |
− | |\n
| |
− | |-
| |
− | |spätné lomítko
| |
− | |\\
| |
− | |\\
| |
− | |-
| |
− | |znak dolára
| |
− | |\$
| |
− | |$
| |
− | |-
| |
− | |dvojitá úvodzovka
| |
− | |\"
| |
− | |\"
| |
− | |-
| |
− | |interpolácia premennej
| |
− | |$premenna
| |
− | |<nowiki>#{</nowiki>premenna<nowiki>}</nowiki><br>
| |
− | |}
| |
− |
| |
− | ==NULL (Nil)==
| |
− | Konštanta NULL v PHP je veľmi podobná konštante Nil v Ruby, pretože obe reprezentujú chýbanie hodnoty vnútri premennej. Nil v Ruby je mierne odlišný v tom, že aj on je objektom, tak ako čokoľvek iné v Ruby. Je to objekt, ktorý reprezentuje „nevýskyt“ hodnoty. Príklad:
| |
− |
| |
− | PHP:
| |
− | <source lang="php">
| |
− | $car = 'red' ;
| |
− | var_export(is_null($car));
| |
− | // => false
| |
− | unset($car);
| |
− | var_export(is_null($car));
| |
− | // => true
| |
− | </source>
| |
− |
| |
− | Ruby :
| |
− | <source lang="ruby">
| |
− | car = 'red'
| |
− | p car.nil?
| |
− | # => false
| |
− | car = nil
| |
− | p car.nil?
| |
− | # => true
| |
− | </source>
| |
− |
| |
− | ==Zmena typu==
| |
− | Ruby automaticky nekonvertuje dátové typy tak ako PHP. Preto ak chceme intrepretovať znak ako číslo alebo naopak, musíme predtým vykonať jeho konverziu:
| |
− |
| |
− | PHP:
| |
− | <source lang="php">
| |
− | print 1.4 + 4;
| |
− | // => 5.4
| |
− | print 1.1 + "2";
| |
− | // => 3.1
| |
− | print "3" + 5;
| |
− | // => 8
| |
− | </source>
| |
− |
| |
− | Ruby :
| |
− | <source lang="ruby">
| |
− | puts 1.4 + 4
| |
− | # => 5.4
| |
− | puts 1.1 + "2"
| |
− | # => String can't be coerced into Float (TypeError)
| |
− | puts 1.1 + "2".to_f
| |
− | # => 3.1
| |
− | puts "3" + 5
| |
− | # => can't convert Fixnum into String (TypeError)
| |
− | puts "3".to_i + 5
| |
− | # => 8
| |
− | </source>
| |
− |
| |
− | ==Premenné==
| |
− | Ruby ponúka viacero typov premenných, tak ako v PHP môžeme použiť lokálne, globálne, statické premenné alebo premenné inštancií. Tieto sme podrobnejšie definovali v predchádzajúcej kapitole, treba ale opäť zmieniť základný rozdiel v zápise lokálnych premenných. V PHP ich píšeme so znakom $ na začiatku, ale v Ruby je premenná začínajúca týmto znakom definovaná ako globálna premenná a lokálna premenná začína podčiarkovníkom alebo malým písmenom.
| |
− | PHP obsahuje okrem toho aj super globálne premenné, ako $_GET, $_POST, $_COOKIE, a $_SESSION. Ruby takéto preddefinované premenné neobsahuje, pretože nebol určený primárne na tvorbu web aplikácií. Preto sú ekvivalenty super globálnych premenných v PHP súčasťou Rails.
| |
− |
| |
− | ==isset/empty==
| |
− | V jazyku PHP používame častokrát funkciu isset, aby sme zistili, či bola priradená hodnota premennej. Ruby sa pri vyhodnocovaní, či je premenná správna chová odlišne ako PHP, základné rozdiely sú zhrnuté v tabuľke 3.3.
| |
− |
| |
− | {|border="2" cellspacing="0" cellpadding="4" width="95%"
| |
− | |+Tabuľka 3.3.:Funkcie s prázdnymi premennými
| |
− | |-
| |
− | |bgcolor = "#B6DDE8"|'''PHP'''
| |
− | |bgcolor = "#B6DDE8"|'''empty($x)'''
| |
− | |bgcolor = "#B6DDE8"|'''is_null($x)'''
| |
− | |bgcolor = "#B6DDE8"|'''if($x)'''
| |
− | |bgcolor = "#B6DDE8"|'''isset($x)'''
| |
− | |bgcolor = "#B6DDE8"|
| |
− | |-
| |
− | |bgcolor = "#B6DDE8"|'''$x = "";'''
| |
− | |bgcolor = "#EAF1DD"|TRUE
| |
− | |bgcolor = "#F2DBDB"|FALSE
| |
− | |bgcolor = "#F2DBDB"|FALSE
| |
− | |bgcolor = "#EAF1DD"|TRUE
| |
− | |
| |
− | |-
| |
− | |bgcolor = "#B6DDE8"|'''$x = null;'''
| |
− | |bgcolor = "#EAF1DD"|TRUE
| |
− | |bgcolor = "#EAF1DD"|TRUE
| |
− | |bgcolor = "#F2DBDB"|FALSE
| |
− | |bgcolor = "#F2DBDB"|FALSE
| |
− | |
| |
− | |-
| |
− | |bgcolor = "#B6DDE8"|'''$x = array()'''
| |
− | |bgcolor = "#EAF1DD"|TRUE
| |
− | |bgcolor = "#F2DBDB"|FALSE
| |
− | |bgcolor = "#F2DBDB"|FALSE
| |
− | |bgcolor = "#EAF1DD"|TRUE
| |
− | |
| |
− | |-
| |
− | |bgcolor = "#B6DDE8"|'''$x = false;'''
| |
− | |bgcolor = "#EAF1DD"|TRUE
| |
− | |bgcolor = "#F2DBDB"|FALSE
| |
− | |bgcolor = "#F2DBDB"|FALSE
| |
− | |bgcolor = "#EAF1DD"|TRUE
| |
− | |
| |
− | |-
| |
− | |bgcolor = "#B6DDE8"|'''$x = 0;'''
| |
− | |bgcolor = "#EAF1DD"|TRUE
| |
− | |bgcolor = "#F2DBDB"|FALSE
| |
− | |bgcolor = "#F2DBDB"|FALSE
| |
− | |bgcolor = "#EAF1DD"|TRUE
| |
− | |
| |
− | |-
| |
− | |bgcolor = "#B6DDE8"|'''$x = "0"'''
| |
− | |bgcolor = "#EAF1DD"|TRUE
| |
− | |bgcolor = "#F2DBDB"|FALSE
| |
− | |bgcolor = "#F2DBDB"|FALSE
| |
− | |bgcolor = "#EAF1DD"|TRUE
| |
− | |
| |
− | |-
| |
− | |bgcolor = "#B6DDE8"|'''Ruby'''
| |
− | |bgcolor = "#B6DDE8"|'''x.empty?'''
| |
− | |bgcolor = "#B6DDE8"|'''x.nil?'''
| |
− | |bgcolor = "#B6DDE8"|'''if(x)'''
| |
− | |bgcolor = "#B6DDE8"|
| |
− | |bgcolor = "#B6DDE8"|'''x.zero?'''
| |
− | |-
| |
− | |bgcolor = "#B6DDE8"|'''x = ""'''
| |
− | |bgcolor = "#EAF1DD"|TRUE
| |
− | |bgcolor = "#F2DBDB"|FALSE
| |
− | |bgcolor = "#EAF1DD"|TRUE
| |
− | |
| |
− | |bgcolor = "#F2F2F2"|u/m<font color="#FF0000">*</font>
| |
− | |-
| |
− | |bgcolor = "#B6DDE8"|'''x = nil'''
| |
− | |bgcolor = "#F2F2F2"|u/m<font color="#FF0000">*</font>
| |
− | |bgcolor = "#EAF1DD"|TRUE
| |
− | |bgcolor = "#F2DBDB"|FALSE
| |
− | |
| |
− | |bgcolor = "#F2F2F2"|u/m<font color="#FF0000">*</font>
| |
− | |-
| |
− | |bgcolor = "#B6DDE8"|'''x = <nowiki>[]</nowiki>'''
| |
− | |bgcolor = "#EAF1DD"|TRUE
| |
− | |bgcolor = "#F2DBDB"|FALSE
| |
− | |bgcolor = "#EAF1DD"|TRUE
| |
− | |
| |
− | |bgcolor = "#F2F2F2"|u/m<font color="#FF0000">*</font>
| |
− | |-
| |
− | |bgcolor = "#B6DDE8"|'''x = <nowiki>{}</nowiki>'''
| |
− | |bgcolor = "#EAF1DD"|TRUE
| |
− | |bgcolor = "#F2DBDB"|FALSE
| |
− | |bgcolor = "#EAF1DD"|TRUE
| |
− | |
| |
− | |bgcolor = "#F2F2F2"|u/m<font color="#FF0000">*</font>
| |
− | |-
| |
− | |bgcolor = "#B6DDE8"|'''x = false'''
| |
− | |bgcolor = "#F2F2F2"|u/m<font color="#FF0000">*</font>
| |
− | |bgcolor = "#F2DBDB"|FALSE
| |
− | |bgcolor = "#F2DBDB"|FALSE
| |
− | |
| |
− | |bgcolor = "#F2F2F2"|u/m<font color="#FF0000">*</font>
| |
− | |-
| |
− | |bgcolor = "#B6DDE8"|'''x = 0'''
| |
− | |bgcolor = "#F2F2F2"|u/m<font color="#FF0000">*</font>
| |
− | |bgcolor = "#F2DBDB"|FALSE
| |
− | |bgcolor = "#EAF1DD"|TRUE
| |
− | |
| |
− | |bgcolor = "#EAF1DD"|TRUE
| |
− | |-
| |
− | |bgcolor = "#B6DDE8"|'''x = "0"'''
| |
− | |bgcolor = "#F2DBDB"|FALSE
| |
− | |bgcolor = "#F2DBDB"|FALSE
| |
− | |bgcolor = "#EAF1DD"|TRUE
| |
− | |
| |
− | |bgcolor = "#F2DBDB"|FALSE
| |
− | |}
| |
− | Vysvetlivky:
| |
− | <nowiki>*</nowiki>n/m - NoMethodError: undefined method
| |
− |
| |
− | ==Operátory==
| |
− | Operátory v Ruby sú špecifické tým, že každý z nich je metódou volanou k určitému objektu. V tomto prípade nemusíme pred metódu písať bodku, Ruby k týmto metódam vytvoril vhodnú syntax ktorá je bežne používaná aj u iných jazykov:
| |
− |
| |
− | Ruby:
| |
− | <source lang="ruby">
| |
− | puts 1.+(2)
| |
− | # => 3
| |
− | puts 1+2
| |
− | # => 3
| |
− | puts 'Hello, '.+('World!' )
| |
− | # => Hello, World!
| |
− | puts 'Hello, '+'World!'
| |
− | # => Hello, World!
| |
− | </source>
| |
− | V Ruby a PHP sú operátory priradenia, aritmetické operátory a bitové operátory používané takmer identicky. V Ruby je možné použiť aj paralelné priradenie viacerých premenných v jednom riadku. Toto je podobné funkcii list s kombináciou funkcie array v PHP. Príklad:
| |
− | PHP:
| |
− | <source lang="php">
| |
− | list($a, $b, $c) = array(1, 2, 3);
| |
− | print $a; # => 1
| |
− | print $b; # => 2
| |
− | print $c; # => 3
| |
− | </source>
| |
− | Ruby:
| |
− | <source lang="ruby">
| |
− | a, b, c = 1, 2, 3
| |
− | puts a # => 1
| |
− | puts b # => 2
| |
− | puts c # => 3
| |
− | </source>
| |
− |
| |
− | V tejto kapitole sme sa pokúsili stručne zhrnúť aspoň základné rozdiely medzi jazykmi Ruby a PHP. Snažili sme sa poukázať na tie odlišnosti, ktoré by mohol prehliadnuť programátor dlhodobo programujúci v jazyku PHP a ktoré by si mal zapamätať. Inak by sa mohol aj na prvý pohľad funkčný kód správať inak, ako by očakával.
| |
− |
| |
− | =Ruby on Rails=
| |
− |
| |
− | =Praktická aplikácia využívajúca Rails=
| |
− |
| |
− | =Záver=
| |
− | =Použitá literatúra=
| |