Č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
filter()nájde aktívnu kandidátku Maya.- Pomocná mapa má tvar
{'matches': [{'name': 'Maya', 'active': true}]}. size() > 0je pravda, preto je prístup namatches[0]bezpečný.- 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
- Spustite pripravený výraz.
- Nastavte obom kandidátom
active: false. - Odstráňte kontrolu
size() > 0a 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šíreniacel.bind()použitého v samostatnej záložke.