abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 18:00 | IT novinky

    DuckDuckGo AI Chat umožňuje "pokecat si" s GPT-3.5 Turbo od OpenAI nebo Claude 1.2 Instant od Anthropic. Bez vytváření účtu. Všechny chaty jsou soukromé. DuckDuckGo je neukládá ani nepoužívá k trénování modelů umělé inteligence.

    Ladislav Hagara | Komentářů: 0
    dnes 14:22 | IT novinky

    VASA-1, výzkumný projekt Microsoftu. Na vstupu stačí jediná fotka a zvukový záznam. Na výstupu je dokonalá mluvící nebo zpívající hlava. Prý si technologii nechá jenom pro sebe. Žádné demo, API nebo placená služba. Zatím.

    Ladislav Hagara | Komentářů: 2
    dnes 04:44 | Nová verze

    Nová čísla časopisů od nakladatelství Raspberry Pi: MagPi 140 (pdf) a HackSpace 77 (pdf).

    Ladislav Hagara | Komentářů: 0
    dnes 01:00 | Nová verze

    ESPHome, tj. open source systém umožňující nastavovat zařízení s čipy ESP (i dalšími) pomocí konfiguračních souborů a připojit je do domácí automatizace, například do Home Assistantu, byl vydán ve verzi 2024.4.0.

    Ladislav Hagara | Komentářů: 0
    včera 22:11 | IT novinky Ladislav Hagara | Komentářů: 0
    včera 20:55 | Nová verze

    Neziskové průmyslové konsorcium Khronos Group vydalo verzi 1.1 specifikace OpenXR (Wikipedie), tj. standardu specifikujícího přístup k platformám a zařízením pro XR, tj. platformám a zařízením pro AR (rozšířenou realitu) a VR (virtuální realitu). Do základu se z rozšíření dostalo XR_EXT_local_floor. Společnost Collabora implementuje novou verzi specifikace do platformy Monado, tj. open source implementace OpenXR.

    Ladislav Hagara | Komentářů: 2
    včera 17:22 | Nová verze

    Byla vydána nová verze 0.38.0 multimediálního přehrávače mpv (Wikipedie) vycházejícího z přehrávačů MPlayer a mplayer2. Přehled novinek, změn a oprav na GitHubu. Požadován je FFmpeg 4.4 nebo novější a také libplacebo 6.338.2 nebo novější.

    Ladislav Hagara | Komentářů: 13
    včera 17:11 | Nová verze

    ClamAV (Wikipedie), tj. multiplatformní antivirový engine s otevřeným zdrojovým kódem pro detekci trojských koní, virů, malwaru a dalších škodlivých hrozeb, byl vydán ve verzích 1.3.1, 1.2.3 a 1.0.6. Ve verzi 1.3.1 je mimo jiné řešena bezpečnostní chyba CVE-2024-20380.

    Ladislav Hagara | Komentářů: 2
    včera 12:11 | IT novinky

    Digitální a informační agentura (DIA) oznámila (PDF, X a Facebook), že mobilní aplikace Portál občana je ode dneška oficiálně venku.

    Ladislav Hagara | Komentářů: 10
    včera 05:11 | Komunita

    #HACKUJBRNO 2024, byly zveřejněny výsledky a výstupy hackathonu města Brna nad otevřenými městskými daty, který se konal 13. a 14. dubna 2024.

    Ladislav Hagara | Komentářů: 2
    KDE Plasma 6
     (68%)
     (10%)
     (2%)
     (20%)
    Celkem 564 hlasů
     Komentářů: 4, poslední 6.4. 15:51
    Rozcestník

    Ruby pro začátečníky - 5 (řídící struktury)

    21. 6. 2006 | Jaromír Hradílek | Programování | 9490×

    Až dosud se naše „programy“ omezovaly jen na práci s proměnnými a výpis na obrazovku. V dnešním díle si vysvětlíme, co jsou to řídící struktury a ukážeme si, jak s nimi v Ruby pracovat.

    Obsah

    1. Logické výrazy
    2. if...elsif...else...end
    3. unless...else...end
    4. case...when...else...end
    5. Cyklus while
    6. Cyklus until
    7. Cyklus for
    8. Metoda times a jí podobné
        8.1 times
        8.2 upto a downto
        8.3 step
    9. Metoda each a jí podobné
        9.1 Array
        9.2 Hash
        9.3 String

    1. Logické výrazy

    Málokdy jsou požadavky na náš program takové, aby jen vykonával stále stejný sled úkonů; mnohem častěji je potřeba přizpůsobovat se nastalým událostem, vyhodnocovat vstupní data a na základě tohoto vyhodnocení pak dále pracovat – právě k tomuto účelu slouží řídící struktury.

    K větvení programu dochází na základě určitých podmínek. Tyto podmínky zapisujeme formou logických výrazů, které jsou interpretrem vyhodnoceny jako pravdivé nebo nepravdivé:

    irb(main):001:0> 4 > 3
    => true
    irb(main):002:0> 2 * 3 < 5
    => false
    irb(main):003:0>

    Zápis 4 > 3 je logický výraz, porovnávající číselné hodnoty 4 a 3. Symbol > je relační operátor.

    Relační operátory slouží ke srovnávání dvou hodnot a vrací buď hodnotu true v případě, že je výraz pravdivý, nebo false v případě, že pravdivý není. V jazyku Ruby rozeznáváme tyto základní relační operátory (existují i další, jimiž se budeme zabývat později):

    operátor: použití: význam:
    == a == b Pravda, je-li a rovno b.
    != a != b Pravda, není-li a rovno b.
    > a > b Pravda, je-li a větší než b.
    < a < b Pravda, je-li a menší než b.
    >= a >= b Pravda, je-li a větší nebo rovno b.
    <= a <= b Pravda, je-li a menší nebo rovno b.

    Za pozornost stojí operátor rovnosti, pro který se v Ruby používá zdvojený znak rovnítka ==. Jednoduché = slouží jako operátor přiřazení a v případě jeho použití v podmíněném příkazu vypíše interpretr varování.

    Další častou chybou bývá změna pořadí znaků =! => a =<. Tento zápis je nicméně neplatný a měl by vést k oznámení chyby. Mezi jednotlivé znaky také nesmíme vložit mezeru!

    Vedle již zmíněných relačních operátorů se v Ruby také setkáme s následujícími logickými operátory, které možnosti logických výrazů významně rozšiřují:

    operátor: alternativa: význam:
    && and Logické AND.
    || or Logické OR.
    ! not Logické NOT.

    Kterou volbu zápisu si zvolíte, záleží jen na vašem vkusu. Díky těmto operátorům pak můžeme podmínky skládat:

    irb(main):004:0> 4 > 3 && 2*3 < 5
    => false
    irb(main):005:0> 4 > 3 || 2*3 < 5
    => true
    irb(main):006:0>

    Jelikož každá relační operace vrací buď hodnotu true nebo false, srovnává logický operátor tyto hodnoty. Pro logický operátor AND pak platí:

    výraz: výsledná hodnota:
    true && true true
    true && false false
    false && true false
    false && false false

    Pro logický operátor OR:

    výraz: výsledná hodnota:
    true || true true
    true || false true
    false || true true
    false || false false

    Logický operátor NOT neguje výraz a obrací jeho význam:

    výraz: výsledná hodnota:
    ! true false
    ! false true

    Relační operátory (==, >, !=, atd.) mají před logickými operátory (&&, ||, a !) přednost a proto se vyhodnocují jako první. Při složitějších konstrukcích je však přehlednější výrazy vhodně ozávorkovat a dát tím pořadí vyhodnocování jasně najevo (hodí se zvláště v případě, kdy nám implicitní pořadí nevyhovuje):

    irb(main):006:0> (4 > 3) || (((2 + 3) * 3) < 5)
    => true
    irb(main):007:0>

    2. if...elsif...else...end

    Dost bylo teorie, je čas se konečně podívat, jak funguje větvení programu v praxi. Řekněme, že si píšeme jednoduchou kalkulačku a chceme ošetřit, aby se ve jmenovateli neocitla nulová hodnota. Přesně k tomuto účelu nám může posloužit konstrukce if:

    irb(main):007:0> delenec = 9; delitel = 3
    => 3
    irb(main):008:0> if (delitel != 0) then
    irb(main):009:1*   delenec / delitel.to_f
    irb(main):010:1> end
    => 3.0
    irb(main):011:0>

    Jak to funguje? Za klíčovým slovem if je uveden logický výraz. Je-li tento vyhodnocen jako pravdivý, provedou se všechny příkazy v těle konstrukce, která je ukončena klíčovým slovem end. Do běžného jazyka by se dal tento zápis poněkud krkolomně přeložit jako „Je-li dělitel neroven nule, pak prověď dělení.

    Závorky okolo logického výrazu jsou nepovinné, nicméně přispívají k čitelnosti. Nepovinné je i slůvko then, začínají-li příkazy až na dalším řádku. Správné by tedy byly i následující zápisy:

    if delitel != 0 then delenec / delitel.to_f end
    if delitel != 0
      delenec / delitel.to_f
    end

    Často bychom chtěli, aby se něco provedlo v případě, že podmínka splněna nebyla, například aby se uživateli vypsala chyba. K tomu slouží else:

    irb(main):011:0> delitel = 0
    => 0
    irb(main):012:0> if (delitel != 0)
    irb(main):013:1>   puts delenec / delitel.to_f
    irb(main):014:1> else
    irb(main):015:1*   puts "CHYBA: Deleni nulou!"
    irb(main):016:1> end
    CHYBA: Deleni nulou!
    => nil
    irb(main):017:0>

    Může se stát (resp. stane se velmi často), že budeme potřebovat reagovat na více podmínek. Jednou z možností by bylo podmínky zanořit do bloku za else, toto by ale nebylo ani elegantní, ani vstřícné k pozdějším úpravám a při větším počtu podmínek bychom se nejspíš utopili. Namísto toho použijeme konstrukci elsif:

    irb(main):017:0> delitel = -4
    => -4
    irb(main):018:0> if (delitel == 0)
    irb(main):019:1>   puts "CHYBA: Deleni nulou!"
    irb(main):020:1> elsif (delitel < 0) || (delenec < 0) 
    irb(main):021:1>   puts "Zaporna jsme jeste nebrali... :-S"
    irb(main):022:1> else
    irb(main):023:1*   puts delenec / delitel.to_f
    irb(main):024:1> end
    Zaporna jsme jeste nebrali... :-S
    => nil
    irb(main):025:0>

    Částí elsif může být v konstrukci libovolný počet, příkaz if se však musí v bloku vyskytovat jen na začátku. Část else je nepovinná, je-li však uvedena, musí se vždy nacházet na konci. Konstrukci je třeba vždy uzavřít pomocí end.

    Jako bonus pro milovníky kompaktních konstrukcí umožňuje Ruby také zápis s podmínkou if na konci:

    irb(main):025:0> puts "Pripada vam tohle prehledne?!" if (true)
    Pripada vam tohle prehledne?!
    => nil
    irb(main):026:0>

    3. unless...else...end

    Konstrukce unless je ekvivalentní negaci if a do češtiny by se dala přeložit jako „není-li“:

    irb(main):025:0> unless (delitel == 0)
    irb(main):026:1>   puts delenec / delitel.to_f
    irb(main):027:1> end
    -2.25
    => nil
    irb(main):028:0>

    Přepis pomocí if by vypadal takto:

    irb(main):028:0> if !(delitel == 0)
    irb(main):029:1>   puts delenec / delitel.to_f
    irb(main):030:1> end
    -2.25
    => nil
    irb(main):031:0>

    Oproti konstrukci if však schází část elsif. Je však opět možný i zápis s podmínkou na konci:

    irb(main):031:0> puts "Delitel neni nulovy" unless (delitel == 0)
    Delitel neni nulovy
    => nil
    irb(main):032:0>

    4. case...when...else...end

    V případě, že máme jednu proměnnou a chceme ji testovat na více hodnot, bylo by použití if poněkud neobratné. Příkaz case nám oproti tomu umožňuje testovat více hodnot naráz, včetně rozsahů:

    irb(main):032:0> cas = 16
    => 16
    irb(main):033:0> case cas
    irb(main):034:1>   when 5 .. 7
    irb(main):035:1>     puts "Dobre rano."
    irb(main):036:1>   when 8 .. 11
    irb(main):037:1>     puts "Hezke dopoledne."
    irb(main):038:1>   when 12
    irb(main):039:1>     puts "Dobre poledne."
    irb(main):040:1>   when 13 .. 18
    irb(main):041:1>     puts "Dobre odpoledne."
    irb(main):042:1>   when 19 .. 21
    irb(main):043:1>     puts "Dobry vecer."
    irb(main):044:1>   when 24, 0
    irb(main):045:1>     puts "Pulnoc!"
    irb(main):046:1>   else
    irb(main):047:1*     puts "Krasnou dobrou noc. :-)"
    irb(main):048:1> end
    Dobre odpoledne.
    => nil
    irb(main):049:0>

    Jak vidíte, je možné zadávat rozsahy pomocí zápisu od .. do (včetně), jednu nebo více hodnot oddělených čárkou, i použít část else pro případ, že nevyhovuje žádná z uvedených podmínek. Konstrukci opět zakončuje end.

    5. Cyklus while

    Často bychom potřebovali, aby se určitá část programu vykonala opakovaně několikrát. K tomuto účelu Ruby nabízí hned několik druhů cyklů a jedním z nich je i while známý z jiných programovacích jazyků. Jeho syntaxe je následující:

    while výraz do
      příkazy
    end

    Příkazy zapsané v těle cyklu se provádí po dobu, co je výraz vyhodnocen jako true. Podobně jako v případě if je i zde psaní do nepovinné, následují-li příkazy na samostatném řádku.

    Činnost cyklu while si ukážeme na následujícím příkladu, který vypíše Fibonacciho řadu čísel menších než 100:

    irb(main):049:0> a, b = 0, 1
    => [0, 1]
    irb(main):050:0> while b < 100
    irb(main):051:1>   print b, ", "
    irb(main):052:1>   a, b = b, a + b
    irb(main):053:1> end
    1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, => nil
    irb(main):054:0>

    6. Cyklus until

    Velmi podobný while je cyklus until; ten se od něj liší jen tím, že příkazy v těle cyklu jsou prováděny po dobu, co je výraz vyhodnocen jako false a je tedy ekvivalentní zápisu:

    while !(výraz) do
      příkazy
    end

    Modifikovaný výpočet Fibonacciho řady by pak vypadal:

    irb(main):054:0> a, b = 0, 1
    => [0, 1]
    irb(main):055:0> until b >= 100
    irb(main):056:1>   print b, ", "
    irb(main):057:1>   a, b = b, a + b
    irb(main):058:1> end
    1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, => nil
    irb(main):059:0>

    7. Cyklus for

    Cyklus for na rozdíl od předchozích slouží k procházení seznamu:

    for položka in seznam do
      příkazy
    end

    Jistě není překvapením, že položku do lze vynechat. Použití může být třeba následující:

    irb(main):059:0> kluci = ["Jiri", "Lukas", "Martin"]
    => ["Jiri", "Lukas", "Martin"]
    irb(main):060:0> for jmeno in kluci
    irb(main):061:1>   puts "Ahoj, ja jsem #{jmeno}."
    irb(main):062:1> end
    Ahoj, ja jsem Jiri.
    Ahoj, ja jsem Lukas.
    Ahoj, ja jsem Martin.
    => ["Jiri", "Lukas", "Martin"]
    irb(main):063:0>

    Stejně tak se hodí, víme-li, kolikrát se má cyklus vykonat, ačkoli k tomuto účelu má Ruby i lepší nástroje (viz dále):

    irb(main):053:0> for i in (1..10)
    irb(main):063:1>   print i, ", "
    irb(main):064:1> end
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, => 1..10
    irb(main):065:0>

    8. Metoda times a jí podobné

    8.1 times

    Pro celočíselné typy je v Ruby definovaná metoda times (doslova krát):

    irb(main):065:0> 3.times { puts "Ahoj" }
    Ahoj
    Ahoj
    Ahoj
    => 3
    irb(main):066:0>

    Tímto zápisem říkáme, že se má blok příkazů mezi znaky { a } provést třikrát. Obecně při použití zápisu n.times dochází k iteraci od 0 do n-1. Pokud bychom chtěli využít aktuální hodnotu, můžeme to provést takto:

    irb(main):066:0> 4.times do
    irb(main):067:1*   |i|  # aktualni hodnotu ulozime do promenne i
    irb(main):068:1*   puts "2^#{i} = #{2**i}"
    irb(main):069:1> end
    2^0 = 1
    2^1 = 2
    2^2 = 4
    2^3 = 8
    => 4
    irb(main):070:0>

    Všimněte si také, že složené závorky je v tomto případě pro konzistentnost nahradit do a end.

    8.2 upto a downto

    Velice podobné metodě times jsou následující dvě:

    irb(main):070:0> 3.upto(7) { |i| print i, " " }
    3 4 5 6 7 => 3
    irb(main):071:0> 5.downto(2) { |i| print i, " " }
    5 4 3 2 => 5
    irb(main):072:0>

    Zápis n.upto(m) říká, že se má iterace bloku provést vzestupně od n po m. Obdobně v případě downto, avšak sestupně.

    8.3 step

    Všechny výše uvedené metody prováděly inkrementaci (dekrementaci) hodnoty právě o 1. Občas by ale přišlo vhod moci si tuto hodnotu zvolit jinak – právě k tomuto účelu slouží metoda step. Její obecný zápis je následující:

    počáteční.step(konečná, krok) {|i| blok }

    V tomto případě probíhá iterace od počáteční hodnoty, která je v každém průběhu inkrementována o hodnotu krok, dokud není výsledná hodnota větší než konečná. Hodnota kroku může být pochopitelně záporná:

    irb(main):072:0> 27.step(2, -3) { |i| print i, " " }
    27 24 21 18 15 12 9 6 3 => 27
    irb(main):073:0>

    9. Metoda each a jí podobné

    K procházení položek seznamů jsme dosud používali cyklu for. Pro jednotlivé datové typy (pole, hashe, ba dokonce řetězce) však existuje také metoda each a od ní odvozené, jejichž zvládnutí vám usnadní práci a umožní elegantně dosáhnout toho, co byste jinak museli složitě obcházet.

    9.1 Array

    Pro datový typ Array (pole) je metoda each intuitivní a funguje obdobně, jako cyklus for:

    irb(main):073:0> kluci = ["Lukas", "Radek", "Jiri", "Martin"]
    => ["Lukas", "Radek", "Jiri", "Martin"]
    irb(main):074:0> kluci.each {
    irb(main):075:1*   |jmeno|
    irb(main):076:1*   print jmeno + ", "
    irb(main):077:1> }
    Lukas, Radek, Jiri, Martin, => ["Lukas", "Radek", "Jiri", "Martin"]
    irb(main):078:0>

    Na prvním řádku jsme si vytvořili seznam obsahující čtyři položky. Tento procházíme pomocí metody each, aktuální položka je vždy načtena do proměnné jmeno a vypsána na obrazovku.

    Krom položek samotných lze pole procházet také po indexech:

    irb(main):078:0> kluci.each_index {
    irb(main):079:1*   |i|    
    irb(main):080:1*   print i, ": ", kluci[i], "\n"
    irb(main):081:1> }
    0: Lukas
    1: Radek
    2: Jiri
    3: Martin
    => ["Lukas", "Radek", "Jiri", "Martin"]
    irb(main):082:0>

    9.2 Hash

    Podobně jako tomu bylo v případě polí, i u typu Hash dochází k průchodu po jednotlivých položkách, tentokrát však vrací metoda each klíč i jemu příslušející hodnotu:

    irb(main):082:0> udaje = {"jmeno" => "Winston", "prijmeni" => "Smith"}
    => {"jmeno"=>"Winston", "prijmeni"=>"Smith"}
    irb(main):083:0> udaje.each {
    irb(main):084:1*   |klic, hodnota|
    irb(main):085:1*   puts "Vase #{klic} je #{hodnota}."
    irb(main):086:1> }
    Vase jmeno je Winston.
    Vase prijmeni je Smith.
    => {"jmeno"=>"Winston", "prijmeni"=>"Smith"}
    irb(main):087:0>

    Ne vždy se nám ale hodí obě hodnoty. Ruby myslí i na toto a proto definuje další dvě metody – each_key pro procházení klíčů a each_value pro totéž s hodnotami:

    irb(main):087:0> udaje.each_key { |klic| puts klic }
    jmeno
    prijmeni
    => {"jmeno"=>"Winston", "prijmeni"=>"Smith"}
    irb(main):088:0> udaje.each_value { |hodnota| puts hodnota }
    Winston
    Smith
    => {"jmeno"=>"Winston", "prijmeni"=>"Smith"}
    irb(main):089:0>

    9.3 String

    Jelikož je řetězec skupina znaků, lze procházet i jej. Metoda each (nebo její ekvivalent each_line) slouží bez parametrů k procházení řetězců po řádcích:

    irb(main):089:0> retezec = "Prvni\nDruhy\nTreti\nCtvrty"
    => "Prvni\nDruhy\nTreti\nCtvrty"
    irb(main):090:0> retezec.each { |radek| print "- ", radek }
    - Prvni
    - Druhy
    - Treti
    - Ctvrty=> "Prvni\nDruhy\nTreti\nCtvrty"
    irb(main):091:0>

    Jak vidíte, je řetězec skutečně procházen po řádcích. Drobnou nepříjemností může být, že je zachován znak konce řádku, nicméně s tím si už jistě poradíte.

    Pomocí parametru lze také explicitně zvolit znak nebo řetězec znaků, jenž má při procházení sloužit jako oddělovač. Následující příklad prochází řetězec po větách, které vypisuje každou na samostatný řádek. K rozpoznání konce vět zde slouží kombinace znaků '':

    irb(main):091:0> retezec = "Dobry den, madam. Racte mne prosim nasledovat."
    => "Dobry den, madam. Racte mne prosim nasledovat."
    irb(main):092:0> retezec.each(". ") { |veta| puts veta }
    Dobry den, madam. 
    Racte mne prosim nasledovat.
    => "Dobry den, madam. Racte mne prosim nasledovat."
    irb(main):093:0>

    Kromě toho je pro řetězce ještě definována metoda each_byte, která slouží k procházení řetězce po jednotlivých znacích:

    irb(main):093:0> retezec = "Ahoj!"
    => "Ahoj!"
    irb(main):094:0> retezec.each_byte { |znak| print znak, " " }
    65 104 111 106 33 => "Ahoj!"
    irb(main):095:0>

    Co znamenají ta čísla? Metoda each_byte totiž vrací číselnou hodnotu daného znaku dle tabulky ASCII. Chceme-li vypsat konkrétní znak, musíme jej převést. K převodu celočíselné hodnoty na příslušný znak slouží metoda chr:

    irb(main):095:0> retezec.each_byte { |znak| print znak.chr }
    Ahoj!=> "Ahoj!"
    irb(main):096:0>

    Příště si řekneme, co to jsou regulární výrazy, a jak se s nimi v Ruby pracuje.

    Nejčtenější články posledního měsíce

    Týden na ScienceMag.cz: Přišli s novým nápadem, jak poznat, zda text napsala umělá inteligence
    Událo se v týdnu 12/2024
    Týden na ITBiz: Americká vláda poskytne Intelu téměř 20 miliard dolarů na podporu výroby čipů v USA

    Nejkomentovanější články posledního měsíce

    Týden na ScienceMag.cz: Přišli s novým nápadem, jak poznat, zda text napsala umělá inteligence
      všechny statistiky »

    Seriál Ruby pro začátečníky (dílů: 8)

    Ruby pro začátečníky - 1 (první díl)
    <—« Ruby pro začátečníky - 4 (vstup, výstup)
    »—> Ruby pro začátečníky - 6 (regulární výrazy)
    Ruby pro začátečníky - 8 (soubory, výjimky, kontakt s OS) (poslední díl)

    Související články

    Ruby pro začátečníky - 1
    Ruby pro začátečníky - 2 (komentáře, aritmetika, proměnné)
    Ruby pro začátečníky - 3 (datové typy)
    Ruby pro začátečníky - 4 (vstup, výstup)
    Seriál: BASH
    Python a PyQt - 1 (úvod)
    Python a PyQt - 2 (podmínky, cykly, tlačítka)
    Začínáme programovat v jazyce Python
    Kommander - 1 (Skriptované GUI)
    Kommander - 2 (Starý parser)
    Kommander - 3 (Nový parser)
    Seriál: Začíname KProgramovať
    Programujeme v PERLu - I
    Programujeme v PERLu - II

    Další články z této rubriky

    LLVM a Clang – více než dobrá náhrada za GCC
    Ze 4 s na 0,9 s – programovací jazyk Vala v praxi
    Reverzujeme ovladače pro USB HID zařízení
    Linux: systémové volání splice()
    Programování v jazyce Vala - základní prvky jazyka
           

    Hodnocení: 83 %

            špatnédobré        

    Nástroje: Tisk bez diskuse

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    21.6.2006 09:29 Tom.š Ze.le.in | skóre: 21 | blog: tz
    Rozbalit Rozbalit vše Re: Ruby pro začátečníky - 5 (řídící struktury)
    Ahoj,

    v popisu operátorů || a spol. mi chybí vcelku důležitá informace, zda je zaručeno, že pokud je výsledek operace jasný po vyhodnocení určitého počtu operandů, další se nevyhodnocují. Tedy, zda je bezproblémová konstrukce typu a != 0 && b == c/a (a s tím související informace o tom, zda je zaručeno, že se obecně operandy operátorů a funkcí vyhodnocují zleva doprava).

    Nejsem (zatím) rubista, ale vím, že tohle je věc, na které při změně jazyka člověk občas uklouzne.
    21.6.2006 10:30 Martin Povolný | blog: Krev na widlich | Brno
    Rozbalit Rozbalit vše Re: Ruby pro začátečníky - 5 (řídící struktury)
    zleva doprava a líně
    $ irb
    irb(main):001:0> (1==1) || (puts "a")
    => true
    irb(main):002:0> (1==1) && (puts "a")
    a
    => nil
    irb(main):003:0> (1==0) && (puts "a")
    => false
    irb(main):004:0> (1==0) || (puts "a")
    a
    => nil
    irb(main):005:0>
    
    21.6.2006 15:42 MiG | Praha
    Rozbalit Rozbalit vše Re: Ruby pro začátečníky - 5 (řídící struktury)
    Jen pozor na to, ze pritom nelze nastavit promennou a pak ji pouzit dale, napr. tohle nefunguje:

    if row = sql.fetch_hash && row['id'] ... end
    21.6.2006 15:46 MiG | Praha
    Rozbalit Rozbalit vše Re: Ruby pro začátečníky - 5 (řídící struktury)
    Jeste uvedu, jak to funguje:
    if row = sql.fetch_hash 
       if row['id'] 
         ... 
       end
    end
    
    21.6.2006 16:12 Kyosuke | skóre: 28 | blog: nalady_v_modre
    Rozbalit Rozbalit vše Re: Ruby pro začátečníky - 5 (řídící struktury)
    irb(main):001:0> d=4
    => 4
    irb(main):002:0> e=0
    => 0
    irb(main):003:0> if (e=d) && (puts e+3) ; end
    7
    => nil
    irb(main):004:0>
    Uniklo mi něco? ;-)
    4.8.2006 18:55 bpfm
    Rozbalit Rozbalit vše Re: Ruby pro začátečníky - 5 (řídící struktury)
    chyba je v tom ze e=d && (puts e+3) se vyhodnocuje jako e=(d && (puts e+3))
    21.6.2006 15:03 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
    Rozbalit Rozbalit vše Re: Ruby pro začátečníky - 5 (řídící struktury)
    To se nazývá zkrácené vyhodnocování. Třeba Pascal tím trpěl, protože se to muselo explicitně zapnout (a ve školách to zakazovali) :-)
    When your hammer is C++, everything begins to look like a thumb.
    21.6.2006 15:22 Kyosuke | skóre: 28 | blog: nalady_v_modre
    Rozbalit Rozbalit vše Re: Ruby pro začátečníky - 5 (řídící struktury)
    Mě hlavně překvapuje, že ve školách najde člověk implicitně zapnutý Pascal... :-D
    21.6.2006 15:45 MiG | Praha
    Rozbalit Rozbalit vše Re: Ruby pro začátečníky - 5 (řídící struktury)
    Opravdu objektove myslet me naucilo az Ruby, do te doby jsem (v PHP) pomoci objektu jen obaloval jiny kod. Pritom ale oddeleny jmenny prostor je jen casti toho, co je na objektovem programovani hezke :-)
    21.6.2006 22:28 Pavel Janousek
    Rozbalit Rozbalit vše Re: Ruby pro začátečníky - 5 (řídící struktury)
    No to bylo v dobach, kdy zakladem programovani byla (spravne!) algoritmizace ukolu a ne lepeni a bastleni "komponent" jako dnes...:-(
    21.6.2006 22:38 Kyosuke | skóre: 28 | blog: nalady_v_modre
    Rozbalit Rozbalit vše Re: Ruby pro začátečníky - 5 (řídící struktury)
    Správnou algoritmizaci úkolu může člověk provést i v Pythonu nebo v Ruby. :-) Zvláště pythonovský kód pak vypadá jako zkopírovaný pseudokód... :-D Takže bych to tak hrozně neviděl. ;-)
    21.6.2006 22:54 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
    Rozbalit Rozbalit vše Re: Ruby pro začátečníky - 5 (řídící struktury)
    To je argument pro Pascal (Delphi), nebo proti?
    When your hammer is C++, everything begins to look like a thumb.
    ppetr avatar 28.7.2013 09:44 ppetr
    Rozbalit Rozbalit vše Re: Ruby pro začátečníky - 5 (řídící struktury)
    Myslim, ze by bylo dobre zminit, ze && a and (resp. || a or) se lisi prioritou. Operatory and a or maji velmi nizkou prioritu, viz. napr. zde.
    24.9.2019 06:20 spam
    Rozbalit Rozbalit vše Re: Ruby pro začátečníky - 5 (řídící struktury)
    I'm new to ruby language but you're giving awareness of this language. Which very clear explanation. Aren’t you able to download applications from the App Store? Or maybe iTunes isn’t letting you download any media content. You are missing off the iCloud login, or maybe you haven’t yet created one. see: http://jdcoopercenter.org

    Blood Sugar Premier is one of the best choices among these types of drugs because of its ingredients. The product is made from natural ingredients and one can expect almost no side effects. You may check out this website https://www.tsanj.org/blood-sugar-premier-review/ for more updates...

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.