Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

2. diel - Vetvenia a cykly v CoffeeScriptu

Vitajte u druhého dielu o CoffeeScriptu. V minulom dieli sme si urobili úvod do tohto jazyka a spomenuli základné syntax. Dnes si ukážeme vetvenia a cykly.

Vetvenia

Ako možno očakávate, pre základné vetvenie použijeme tradičnú slovka if / else a ako sme si už zvykli, vynecháme zátvorky:

x = 5

if x == 5
  alert 'ano'
else if x is 4 or x is 6
  alert 'těsně vedle'
else
  alert 'ne'

JavaScript:

var x;

x = 5;

if (x === 5) {
  alert('ano');
} else if (x === 4 || x === 6) {
  alert('těsně vedle');
} else {
  alert('ne');
}

Na kódu môžeme vypozorovať, že CoffeeScript prevádza == na ===. Núti vás teda explicitne prevádzať hodnoty, ak napr. Chcete, aby sa string '40' rovnal číslu 40. Tiež pridáva aliasy rôznym operátorom (or je ||, is ich === atď.), Aby kód skutočne pripomínal skôr jazyk než súbor matematických zápisov. Môžete však používať operátormi ako ich poznáte z JS. Tabuľku s rôznymi operátormi nájdete na konci článku.

Z Ruby si CoffeeScript vypožičal kľúčové slovo unless, ktoré je vlastne len if not a môžeme použiť aj slovo then, aby sa to pekne vošlo na jediný riadok:

unless false then console.log 2     # Vždy vypíše do konzole číslo 2.

Niekedy môžete chcieť vložiť do premennej hodnotu len vtedy, keď je splnená podmienka. K tomu môžete použiť postfixový tvar:

kafe = 'Instant' if maloCasu

JavaScript:

var kafe;
if (maloCasu) {
  kafe = 'Instant';
}

Keď priradíme vetvenia k premennej, CoffeeScript ho prevedie na ternárne operátor:

nalada = if den is 'vsedni' and not prazdniny then 'spatna' else 'dobra'

JavaScript:

var nalada;
nalada = den === 'vsedni' && !prazdniny ? 'spatna' : 'dobra';

Znalci Pythone spoznajú zreťazené porovnávanie premenných, ktoré CoffeeScript tiež podporuje:

if x > y < z >= a <= b is c isnt d
 console.log 'eh...ok...'

JavaScript:

if ((((((x > y && y < z) && z >= a) && a <= b) && b === c) && c !== d)) {
  console.log('eh...ok...');
}

Existenčné operátor

Ak chceme zistiť, či je premenná / objekt definovaný (a) a nie je null, môžeme použiť tzv. Existenčnú operátor - ? (nepliesť s ternárním operátorom z iných jazykov), ktorý vracia true v prípade, že premenná nie je null alebo undefined.

alert 'To je katastrofa!' unless kavovar?

JavaScript:

if (typeof kavovar === "undefined" || kavovar === null) {
  alert('To je katastrofa!');
}

Možno použiť aj priradenie hodnoty do premennej v prípade, že premenná nie je null (musí byť však deklarovaná):

x = undefined
x ?= 5

JavaScript:

var x;
x = void 0;
if (x == null) {
  x = 5;
}

Pozor! Na rozdiel od JS je v CoffeeScript slovo undefined kľúčové, nemôžete mať teda premennú s týmto menom.

Existenčné operátor ide použiť samozrejme aj na objekty a funkcie, takže možno tvoriť klenoty ako:

objekt?.funkce? parametr if parametr?

JavaScript:

if (typeof parametr !== "undefined" && parametr !== null) {
  if (typeof objekt !== "undefined" && objekt !== null) {
    if (typeof objekt.funkce === "function") {
      objekt.funkce(parametr);
    }
  }
}

Tu už to začína byť naozaj nechutné a to sme ani nenakousli OOP.

Switch

Dostali sme sa k poslednej dôležité časti vetvenia a tou je samozrejme switch. Jeho syntax v CoffeeScriptu je nasledovné:

switch spanek
  when 'spatny' then mnozstviKofeinu = 'hodne'
  when 'prumerny' then mnozstviKofeinu = 'malo'
  when 'dobry' then do nepijKafe
  else alert '???'

JavaScript:

var mnozstviKofeinu;

switch (spanek) {
  case 'spatny':
    mnozstviKofeinu = 'hodne';
    break;
  case 'prumerny':
    mnozstviKofeinu = 'malo';
    break;
  case 'dobry':
    nepijKafe();
    break;
  default:
    alert('asi nespíš a jsi robot');
}

Pomocou switche možno tiež priraďovať hodnoty namiesto niekoľkých if / else:

bodu = 83
znamka = switch
 when bodu < 60 then 5
 when bodu < 70 then 4
 when bodu < 80 then 3
 when bodu < 90 then 2
 else 1
# znamka === 2

JavaScript:

var bodu;
bodu = 83;

znamka = (function() {
  switch (false) {
    case !(bodu < 60):
      return 5;
    case !(bodu < 70):
      return 4;
    case !(bodu < 80):
      return 3;
    case !(bodu < 90):
      return 2;
    default:
      return 1;
  }
})();

Cykly

While

Základná while cyklus:

while podminka
 alert 'Cykluju...'         # 'bezna' forma

alert 'Cykluju...' while podminka   # postfix forma

Oba kódy sa skompiluje do:

while (podminka) {
  alert('Cykluju...');
}

Podobne ako unless je if not, until je while not:

alert 'Cykluju a podminka neni pravdiva...' until podminka

JavaScript:

while (!podminka) {
  alert('Cykluju a podminka neni pravdiva...');
}

Buďte s until i unless opatrní a nepridávajte do podmienok negácia, kód sa bude zle čítať. Tiež by sa s týmito slovami nemalo používať else.

Pomocou loop vytvoríme nekonečný cyklus:

loop
  alert 'Nekončíííím...'

JavaScript:

while (true) {
  alert('Nekončíííím...');
}

Keď som v minulom diele písal, že "Čo ide v JS, ide aj v CoffeeScriptu", nebola to tak celkom pravda, ako (nielen) teraz uvidíte. CoffeeScript nemá do-while cyklus, keďže slovo do v CoffeeScriptu znamená 'volej funkciu', ide ho však ľahko nahradiť nasledovným zápisom:

loop
  ### tělo cyklu ###
  break unless podminka

JavaScript:

while (true) {
  /* tělo cyklu */
  if (!podminka) {
    break;
  }
}

Pomocou cyklu možno vytvárať pole:

cislo = 10
pole = while cislo--
  cislo

# pole = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

JavaScript:

var cislo, pole;
cislo = 10;

pole = (function() {
  var _results;
  _results = [];
  while (cislo--) {
    _results.push(cislo);
  }
  return _results;
})();

A keď chceme, aby cyklus (ne) prechádzal určitými hodnotami, použijeme slovo when. Toto sa nám bude obzvlášť hodiť neskôr pri for-in a for-of cykloch. Tento kód vám podobne ako v minulom príklade vytvorí pole, ale bez párnych čísel:

cislo = 10
pole = while cislo-- when cislo % 2 isnt 0
  cislo
# pole = [9, 7, 5, 3, 1]

Časť JS kódu po úprave:

//...
  while (cislo--) {
    if (cislo % 2 !== 0) {
      _results.push(cislo);
    }
  }
//...

For

Pre základné for cyklus použijeme nám už známe n-tica:

for [1..10]     # dvě tečky <=
  console.log 'a'

for [1...10]        # tři tečky <
  console.log 'a'

JavaScript:

var _i, _j;

for (_i = 1; _i <= 10; _i++) {
  console.log('a');
}

for (_j = 1; _j < 10; _j++) {
  console.log(_j);
}

Keby sme chceli vypísať číslo, ktoré je zrovna prechádzaní cyklom:

for i in [1..10]
  console.log i

V JS for cyklu bude nasledujúci:

for (i = _i = 1; _i <= 10; i = ++_i)

Nie je to zrovna najelegantnejší riešenie, ale tá premenná navyše snáď nikoho nezabije. Mohli by ste samozrejme premennú aj nahradiť _i, avšak pre každý ďalší cyklus sa tvorí nová premenná (_j, _k atď ...), a v .coffee súbore ju nevidíte, mohli by ste s týmto spôsobom naraziť.

Nechceme vždy riadiaci premennú cyklu zvyšovať o 1, máme našťastie k dispozícii slovo by:

for i in [50..0] by -5

JavaScript:

for (i = _i = 50; _i >= 0; i = _i += -5)

Cyklus for-in v CoffeeScriptu používame aj na pole (Pozor! Toto je veľký rozdiel oproti JavaScriptu, kde je tento cyklus používaný na objekty). Ukážeme si príklad na známom poli s kávami a nebudeme chcieť rozpustnú:

kavy = ['Alžírská', 'Espresso', 'Cappuccino', 'Latte', 'Rozpustná', 'Vídeňská']

console.log kava for kava in kavy when kava isnt 'Rozpustná'

JavaScript:

var kava, kavy, _i, _len;
kavy = ['Alžírská', 'Espresso', 'Cappuccino', 'Latte', 'Rozpustná', 'Vídeňská'];

for (_i = 0, _len = kavy.length; _i < _len; _i++) {
  kava = kavy[_i];
  if (kava !== 'Rozpustná') {
    console.log(kava);
  }
}

Od ES6 existuje cyklus for-of pre pole, CoffeeScript však volí toto riešenie kvôli kompatibilite. Čo je teda ekvivalentom for-in v CoffeeScriptu? Ironicky je to for-of. Pre príklad si vypožičiame kaviareň z prvého dielu:

kavarna =
 jmeno: "Kofeinová pumpa"
 rokZalozeni: 2001
 freeWifi: yes
 napojovyListek:
  kavy: [
   "Cappuccino"
   "Moccaccino"
   "Espresso"
  ]
  nealko: [
   "Sprite"
   "Pomerančový džus"
   "Voda z Marsu"
  ]

for nazev, hodnota of kavarna
 console.log "#{nazev} => #{hodnota}"

# jmeno => Kofeinová pumpa
# rokZalozeni => 2001
# freeWifi => true
# napojovyListek => [object Object]

Samotný cyklus v JS:

for (nazev in kavarna) {
  hodnota = kavarna[nazev];
  console.log("" + nazev + ": " + hodnota);
}

Čo keby sme chceli vypísať prvých päť vlastností v objekte? Ani to nie je problém:

console.log (nazev for nazev of document)[0...5]
# vytvoří pole a vypíše: ["vlinkColor", "linkColor", "alinkColor", "fgColor", "bgColor"]

Nedávajte medzeru medzi pravou guľatou a ľavú hranatú zátvorku, program by potom robil niečo úplne iné. Hlavne si zapamätá - v JavaScripte používame of na pole, in na objekty, v CoffeeScriptu je to naopak.

Uf, tak sme sa dostali ku koncu. Nabudúce sa pozrieme na hlavné pilier JavaScriptu - funkcie. Na záver tu máte tabuľku s operátormi, ako som sľúbil:

is, == ===
isnt,! = ! ==
not !
and &&
or ||
in nie je prekladaný (of)
of in
a // b Math.floor (a / b)
a %% b (A% b + b)% b)

 

Predchádzajúci článok
Úvod do CoffeeScriptu
Všetky články v sekcii
CoffeeScript
Preskočiť článok
(neodporúčame)
Funkcie a výnimky v CoffeeScript
Článok pre vás napísal Yahkem
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
...
Aktivity