Forstå advarsler i streng tilstand

Forstå advarsler i streng tilstand

> LeekScript vejledning

Du har besluttet at skifte til streng tilstand, og editoren oversvømmer dig med en masse advarsler, som ikke fandtes før. Ingen panik – det er netop hele pointen med streng tilstand at være mindre tilgivende og give mindre frihed, især hvad angår typer. Lad os se på nogle almindelige advarsler for først at forstå, hvad problemet egentlig er, og derefter finde løsninger på det.

Farlig konvertering fra "real" til "integer"

Et første, simpelt tilfælde: Jeg vil gemme resultatet af en beregning i en variabel af heltalstypen.

Problemet her er, at funktionen sqrt altid returnerer en værdi af typen real, selv om sqrt(4) matematisk set er 2. Men et reelt tal kan ikke lægges i en heltalsvariabel uden tab: hvad skal der fx ske med decimalerne i sqrt(2)? Compileren beder derfor om et eksplicit valg. Der findes flere løsninger på denne advarsel:

Farlig konvertering fra "integer?" til "integer"

Et andet tilfælde: Jeg har et associativt array (Map) af heltal defineret som nedenfor, og jeg vil gemme en værdi fra dette array i en variabel, der også er af heltalstypen. Typerne burde normalt stemme overens ...

Hvorfor siger advarslen, at mapEntier[0] er af typen "integer?" og ikke bare "integer"? Til påmindelse: "?" i slutningen af en type betyder, at typen også accepterer værdien null; det svarer til "integer | null". Så hvorfor skulle mit associative array kunne returnere null, når det ifølge sin type kun indeholder integer? Når man vil læse en værdi i et associativt array, skal man give det en nøgle, her "0" i kantede parenteser, og denne nøgle skal være af den type, der er defineret for arrayet, her en integer, så alt er i orden på det punkt. Men intet garanterer editoren, at nøglen findes i arrayet, og hvis man læser et associativt array med en nøgle, der ikke findes, er returværdien altid null. Derfor vil resultatet af et opslag i et associativt array via nøgle altid være nullable. Lad os nu se, hvordan vi løser problemet, så vi ikke længere får advarsler:

Farlig konvertering fra "(Array, Function any>)" til "()"

I dette tilfælde har jeg en liste af heltal, som jeg vil sortere – umiddelbart ikke noget kompliceret, jeg bruger endda eksemplet fra dokumentationen

Alligevel ender jeg med 2 advarsler på denne simple linje. Lad os starte med den første: den er omgivet af parenteser, hvilket betyder, at problemet ligger i funktionens parametre, som ikke overholder den forventede signatur. Lad os kigge i dokumentationen for arraySort for at se dens signatur: Function real | integer> => Array> Det er altså en funktion, der forventer 2 parametre: en liste som første parameter og som anden parameter en funktion, der selv tager 2 parametre og returnerer et heltal eller et reelt tal. Som første parameter giver vi den ganske rigtigt en liste, så ingen problemer der; det er altså den anden parameter, der er noget galt med: vi giver en funktion med signaturen Function any>, mens arraySort forventer Function real | integer> – returtypen er ikke den forventede.

Typeproblemet med callback-funktionen er løst; tilbage er den anden advarsel. Som vi lige har set, er returværdien fra arraySort ikke en Array\, som vi forventer for vores variabel, men blot Array, så vi skal caste returværdien eksplicit for at rette problemet.