CH07-L04 · praktické použitie

Medzistav a bezpečný výber

Prenesiete vypočítaný medzivýsledok cez jednoprvkový zoznam a ochránite prístup na index 0.

Všeobecný CELSpustiteľné tuZdokumentované
Čo sa naučím?

Viete použiť mapový medzistav, skontrolovať počet výsledkov a až potom bezpečne prečítať prvú položku.

Kde si to vyskúšam?

Priamo nižšie v skúšobnom prostredí prehliadača.

Čo mám urobiť?

Spustite oba režimy, porovnajte pôvod ich hodnôt a potom dokončite úlohu.

Vyskúšajte CEL · pilot v prehliadači

Vyskúšajte oba spôsoby zadania hodnôt

Lokálne hodnoty môžete definovať v jednom výraze CEL alebo môžete premenné zadať ako vstup JSON. Všetko sa vykonáva vo vašom prehliadači.

Pilotná podmnožina CEL
Jeden samostatný výraz CELFunkcia cel.bind() priradí hodnote lokálny názov a vráti výsledok posledného výrazu.

cel.bind()cel.bind() je voliteľné oficiálne rozšírenie. Nie je súčasťou jadra jazyka CEL a hostiteľská aplikácia ho nemusí podporovať.

Tip: výraz spustíte aj klávesmi Ctrl/⌘ + Enter.
Výsledok

Aktívny príklad vyhodnotíte tlačidlom Spustiť CEL.

Rozsah pilotu: literály, explicitné konverzie, lokálne premenné vytvorené pomocou cel.bind(), premenné z JSON, zoznamy, mapy, prítomnosť, kolekčné makrá, základné kontroly reťazcov, časové hodnoty, aritmetika, porovnávanie, logika a podmienený operátor.

Čo budete robiť

Vypočítate zoznam zhôd iba raz, uložíte ho do pomocnej mapy a pred použitím indexu 0 overíte jeho veľkosť. Zároveň uvidíte všeobecný vzor jednoprvkového zoznamu pre prenášanie medzivýsledku.

Ako to funguje

[{'matches': candidates.filter(candidate, candidate.active)}]
  .map(state,
    state.matches.size() > 0
      ? state.matches[0].name
      : 'not-found')
  [0]

Zoznam obsahuje presne jednu pomocnú mapu. map() preto vykoná telo raz a názov state sprístupní vypočítané zhody. Výsledkom map() je opäť jednoprvkový zoznam, z ktorého sa na konci vyberie výsledná hodnota.

Vyhodnotenie krok za krokom

  1. filter() nájde aktívnu kandidátku Maya.
  2. Pomocná mapa má tvar {'matches': [{'name': 'Maya', 'active': true}]}.
  3. size() > 0 je pravda, preto je prístup na matches[0] bezpečný.
  4. Vnútorný výsledok je 'Maya' a vonkajší index [0] ho vyberie zo zoznamu.

Ak nie je aktívny žiadny kandidát, podmienka vráti 'not-found' bez prístupu na neexistujúcu položku.

Vaša úloha

  1. Spustite pripravený výraz.
  2. Nastavte obom kandidátom active: false.
  3. Odstráňte kontrolu size() > 0 a skúste priamo prečítať state.matches[0].name.

Očakávané pozorovanie: Bez zhody bezpečná verzia vráti 'not-found'; priamy prístup na index 0 skončí chybou.

Častá chyba

Vonkajší [0] je bezpečný iba preto, že zoznam vytvárate priamo s jednou položkou. Kontrola state.matches.size() chráni iný zoznam — výsledok filtra, ktorý môže byť prázdny.

Zobraziť vysvetlenie

Vo výraze sú dva rozdielne zoznamy. Jednoprvkový obal má vždy veľkosť 1, ale matches môže mať veľkosť 0 až počet kandidátov.

Kontrolná otázka

Ktorý z dvoch indexov alebo zoznamov potrebuje kontrolu veľkosti a prečo?

Hlavná myšlienka

Medzivýsledok môžete preniesť pomocnou mapou, ale každý prístup na index musí mať zaručenú potrebnú veľkosť zoznamu.

Zdroje

  • CEL-DEV — oficiálny prehľad CEL a kolekčných makier.
  • CEL-LANG — oficiálna definícia zoznamov, máp, indexovania a podmienok.
  • CEL-GO-BIND — oficiálna dokumentácia voliteľného rozšírenia cel.bind() použitého v samostatnej záložke.