# Toto je komentár=begin
Toto je viacriadkový komentár
Nikto ho nepoužíva
Ani ty by si nemal
=end# V prvom rade: Všetko je objekt.# Čísla sú objekty3.class#=> Fixnum3.to_s#=> "3"# Základná aritmetika1+1#=> 28-1#=> 710*2#=> 2035/5#=> 72**5#=> 32# Aritmetika je iba syntaktickým cukrom# pre volanie metódy nad objektom1.+(3)#=> 410.*5#=> 50# Špeciálne hodnoty sú objektaminil# ničtrue# pravdafalse# ložnil.class#=> NilClasstrue.class#=> TrueClassfalse.class#=> FalseClass# Rovnosť1==1#=> true2==1#=> false# Nerovnosť1!=1#=> false2!=1#=> true# Okrem samotného false, nil je jedinou ďalšou 'nepravdivou' hodnotou!nil#=> true!false#=> true!0#=> false# Ďalšie porovnania1<10#=> true1>10#=> false2<=2#=> true2>=2#=> true# Logické operácietrue&&false#=> falsetrue||false#=> true!true#=> false# Existujú aj alternatívne verzie logických operátorov s nižšou prioritou.# Tie sa využívajú ako konštrukcie pre riadenie toku na reťazenie výrazov# kým jeden z nich nevráti true alebo false.# `sprav_nieco_ine` sa vykoná ak bude `sprav_nieco` úspešné (vráti true)sprav_nieco()andsprav_nieco_ine()# `zaznamenaj_chybu` sa vykoná ak `sprav_nieco` neuspeje (vráti false)sprav_nieco()orzaznamenaj_chybu()# Reťazce sú objekty'Ja som reťazec'.class#=> String"Ja som tiež reťazec".class#=> Stringretazec='použiť interpoláciu reťazca'"Môžem #{retazec} pri použití dvojitých úvodzoviek"#=> "Môžem použiť interpoláciu reťazca pri použití dvojitých úvodzoviek"# Preferuj jednoduché úvodzovky pred dvojitými, ak je to možné# Dvojité úvodzovky totiž vyžadujú ďalšie výpočty# Kombinuj reťazce, ale nie s číslami'ahoj '+'svet'#=> "ahoj svet"'ahoj '+3#=> TypeError: can't convert Fixnum into String'ahoj '+3.to_s#=> "ahoj 3"# Výpis na štandardný výstupputs"Píšem!"# Premennéx=25#=> 25x#=> 25# Všimni si, že priradenie vracia priradenú hodnotu# To umožňuje viacnásobné priradenie:x=y=10#=> 10x#=> 10y#=> 10# Podľa konvencie sa pre mená premenných využíva snake_casesnake_case=true# Používaj správne (opisné) mená premennýchcesta_ku_korenovemu_adresaru='/dobre/meno/'cesta='/zle/meno/'# Symboly (sú objektami)# Symboly sú nemenné znovupoužiteľné konštanty, ktoré sú interne# reprezentované ako číslo. Často sa používajú namiesto reťazcov# pre efektívnu reprezentáciu špecifickej hodnoty.:cakajuci.class#=> Symbolstatus=:cakajucistatus==:cakajuci#=> truestatus=='cakajuci'#=> falsestatus==:schvaleny#=> false# Polia# Toto je polepole=[1,2,3,4,5]#=> [1, 2, 3, 4, 5]# Polia môžu obsahovať rôzne typy objektov[1,'ahoj',false]#=> [1, "ahoj", false]# Polia môžu byť indexované# Od začiatkupole[0]#=> 1pole[12]#=> nil# Podobne ako pri aritmetike, prístup prostredníctvom [var]# je iba syntaktickým cukrom pre volanie metódy [] nad objektompole.[]0#=> 1pole.[]12#=> nil# Od koncapole[-1]#=> 5# Pomocou počiatočného indexu a dĺžkypole[2,3]#=> [3, 4, 5]# Alebo rozsahompole[1..3]#=> [2, 3, 4]# Pridanie prvku do polapole<<6#=> [1, 2, 3, 4, 5, 6]# Alebo taktopole.push(6)#=> [1, 2, 3, 4, 5, 6]# Skontroluje, či už je objekt v polipole.include?(1)#=> true# Asociatívne polia (hash) sú slovníkmi s dvojicami kľúč-hodnota.# Asociatívne polia sú označované kučeravými zátvorkami:asoc_pole={'farba'=>'zelena','cislo'=>5}asoc_pole.keys#=> ['farba', 'cislo']# V asociatívnych poliach sa rýchlo vyhľadáva pomocou kľúčaasoc_pole['farba']#=> 'zelena'asoc_pole['cislo']#=> 5# Asking a hash for a key that doesn't exist returns nil:asoc_pole['nic tu nie je']#=> nil# Od verzie Ruby 1.9 existuje špeciálna syntax,# pri ktorej sa využíva symbol ako kľúčnove_asoc_pole={defcon:3,akcia:true}nove_asoc_pole.keys#=> [:defcon, :akcia]# Skontroluje existenciu kľúča a hodnoty v asociatívnom polinove_asoc_pole.has_key?(:defcon)#=> truenove_asoc_pole.has_value?(3)#=> true# Tip: Polia aj asociatívne polia sú vypočítateľné (Enumerable)# Zdieľajú veľa užitočných metód ako each, map, count a ďalšie# Štruktúry riadeniaiftrue'if podmienka'elsiffalse'else if, voliteľná vetva'else'else, tiež voliteľná vetva'endforpocitadloin1..5puts"iterácia #{pocitadlo}"end#=> iterácia 1#=> iterácia 2#=> iterácia 3#=> iterácia 4#=> iterácia 5# NIKTO však nepoužíva for cyklus# Aj ty by si mal preferovať metódu "each" a podať jej blok# Blok kus kódu, ktorý môžeš podať metódam ako "each"# Je podobný lambdám alebo anonymným funkciám v iných jazykoch## Metóda "each" pre rozsah spustí blokpre každý element tohto rozsahu# Blok získava počítadlo ako parameter# Volanie metódy "each" s blokomvyzerá takto:(1..5).eachdo|pocitadlo|puts"iterácia #{pocitadlo}"end#=> iterácia 1#=> iterácia 2#=> iterácia 3#=> iterácia 4#=> iterácia 5# Blok môže byť uzavretý aj v kučeravých záítvorkách:(1..5).each{|pocitadlo|puts"iterácia #{pocitadlo}"}# Obsah dátových štruktúr môže byť tiež prechádzaný pomocou metódy "each"pole.eachdo|prvok|puts"#{prvok} je súčasťou pola"endasoc_pole.eachdo|kluc,hodnota|puts"#{kluc} je #{hodnota}"endpocitadlo=1whilepocitadlo<=5doputs"iterácia #{pocitadlo}"pocitadlo+=1end#=> iterácia 1#=> iterácia 2#=> iterácia 3#=> iterácia 4#=> iterácia 5znamka='B'caseznamkawhen'A'puts'Len tak ďalej, chlapče'when'B'puts'Viac šťastia nabudúce'when'C'puts'Zvládneš to aj lepšie'when'D'puts'S odratými ušami'when'F'puts'Zlyhal si!'elseputs'Iný systém známkovania, čo?'end#=> "Viac šťastia nabudúce"# prípady (cases) môžu tiež využívať rozsahyznamka=82caseznamkawhen90..100puts'Hurá!'when80...90puts'Dobrá práca'elseputs'Zlyhal si!'end#=> "Dobrá práca"# Zaobchádzanie s výnimkamibegin# kód, ktorý môže vyhodiť výnimkuraiseNoMemoryError,'Došla ti pamäť.'rescueNoMemoryError=>premenna_vynimkyputs'Nastala vynimka NoMemoryError',premenna_vynimkyrescueRuntimeError=>ina_premenna_vynimkyputs'Nastala vynimka RuntimeError'elseputs'Toto sa spustí, ak nenastala žiadna výnimka'ensureputs'Táto časť kódu sa spustí vždy'end# Funkciedefzdvojnasob(x)x*2end# Funkcie (a bloky) implicitne vracajú hodnotu posledného výrazuzdvojnasob(2)#=> 4# Zátvorky sú voliteľné ak je výsledok jednoznačnýzdvojnasob3#=> 6zdvojnasobzdvojnasob3#=> 12defsuma(x,y)x+yend# Argumenty metódy sa oddeľujú čiarkamisuma3,4#=> 7sumasuma(3,4),5#=> 12# yield# Všetky metódy majú implicitný, voliteľný parameter bloku# môže byť zavolaný ako kľúčové slovo 'yield'defobalputs'{'yieldputs'}'endobal{puts'ahoj svet'}# {# ahoj svet# }# Funkcii môžeš odovzdať blok# "&" označuje referenciu na tento blokdefhostia(&blok)blok.call'nejake argumenty'end# Tiež môžeš odovzdať zoznam argumentov, ktoré sa prevedú na pole# Na to sa využíva operátor "*"defhostia(*pole)pole.each{|host|putshost}end# Trieda sa definuje kľúčovým slovom classclassClovek# Premenná triedy. Je zdieľaná všetkými inštanciami tejto triedy.@@druh='H. sapiens'# Jednoduchý inicializátordefinitialize(meno,vek=0)# Priradí argument k premennej inštancie "meno"@meno=meno# Ak nie je uvedený vek, použije sa špecifikovaná predvolená hodnota@vek=vekend# Jednoduchá metóda pre nastavenie hodnoty premennejdefmeno=(meno)@meno=menoend# Jednoduchá metóda pre získanie hodnoty premennejdefmeno@menoend# Vyššie uvedená funkcionalita môže byť zapúzdrená použitím# metódy attr_accessorattr_accessor:meno# Metódy pre nastavenie a získanie hodnoty premennej môžu byť vytvorené# aj individuálneattr_reader:menoattr_writer:meno# Metóda triedy používa kľúčové slovo self pre odlíšenie# od metód inštancií. Môže byť volaná iba nad triedou, nie inštanciou.defself.povedz(sprava)putsspravaenddefdruh@@druhendend# Vytvorenie inštancie triedyjim=Clovek.new('Jim Halpert')dwight=Clovek.new('Dwight K. Schrute')# Skúsme zavolať zopár metódjim.druh#=> "H. sapiens"jim.meno#=> "Jim Halpert"jim.meno="Jim Halpert II"#=> "Jim Halpert II"jim.meno#=> "Jim Halpert II"dwight.druh#=> "H. sapiens"dwight.meno#=> "Dwight K. Schrute"# Volanie metódy triedyClovek.povedz('Ahoj')#=> "Ahoj"# Rozsah platnosti premennej je definovaná spôsobom, akým ju nazveme.# Premenné začínajúce znakom $ majú globálnu platnosť.$premenna="Ja som globálna premenná"defined?$premenna#=> "global-variable"# Premenné začínajúce znakom @ majú platnosť v rámci inštancie@premenna="Ja som premenná inštancie"defined?@premenna#=> "instance-variable"# Premenné začínajúce znakmi @@ majú platnosť v rámci triedy@@premenna="Ja som premenná triedy"defined?@@premenna#=> "class variable"# Premenné začínajúce veľkým písmenom sú konštantyPremenna="Ja som konštanta"defined?Premenna#=> "constant"# Trieda je tiež objektom v ruby, takže aj ona môže mať premenné inštancie.# Premenná triedy je zdieľaná triedou a jej nasledovníkmi.# Základná triedaclassClovek@@foo=0defself.foo@@fooenddefself.foo=(hodnota)@@foo=hodnotaendend# Odvodená triedaclassPracovnik<ClovekendClovek.foo# 0Pracovnik.foo# 0Clovek.foo=2# 2Pracovnik.foo# 2# Premenné inštancie triedy nie sú zdieľané jej nasledovníkmi.classClovek@bar=0defself.bar@barenddefself.bar=(hodnota)@bar=hodnotaendendclassDoktor<ClovekendClovek.bar# 0Doktor.bar# nilmodulePrikladModuludeffoo'foo'endend# Vloženie modulu (include) previaže jeho metódy s inštanciou triedy.# Rozšírenie modulu (extend) previaže jeho metódy so samotnou triedou.classOsobaincludePrikladModuluendclassKnihaextendPrikladModuluendOsoba.foo# => NoMethodError: undefined method `foo' for Osoba:ClassOsoba.new.foo# => 'foo'Kniha.foo# => 'foo'Kniha.new.foo# => NoMethodError: undefined method `foo'# Spätné volania sú vykonané pri vložení alebo rozšírení modulumodulePrikladKoncernudefself.included(zaklad)zaklad.extend(MetodyTriedy)zaklad.send(:include,MetodyInstancie)endmoduleMetodyTriedydefbar'bar'endendmoduleMetodyInstanciedefqux'qux'endendendclassNiecoincludePrikladKoncernuendNieco.bar# => 'bar'Nieco.qux# => NoMethodError: undefined method `qux'Nieco.new.bar# => NoMethodError: undefined method `bar'Nieco.new.qux# => 'qux'