> LeekScript-zelfstudie
Je hebt besloten over te stappen op de strikte modus, en de editor overspoelt je met allerlei waarschuwingen die er vroeger niet waren. Geen paniek: dat is net het hele punt van de strikte modus, die minder permissief is en vooral minder vrijheid laat bij de typering. Laten we enkele veelvoorkomende waarschuwingen bekijken, om eerst te begrijpen wat het gemelde probleem is, en dan oplossingen te vinden om het te verhelpen.
Een eerste eenvoudig geval: ik wil het resultaat van een berekening opslaan in een variabele van het type integer.
Het probleem hier is dat de functie sqrt altijd een waarde van het type real teruggeeft, ook al is sqrt(4) wiskundig gezien 2. Maar een reëel getal past niet zonder verlies in een variabele van het type integer: wat te doen met de decimalen van sqrt(2), bijvoorbeeld? De compiler vraagt dus om een expliciete keuze te maken. Er bestaan verschillende oplossingen voor deze waarschuwing:
Een ander geval: ik heb een associatieve array (Map) van gehele getallen die als volgt is gedefinieerd, en ik wil een waarde uit die associatieve array opslaan in een variabele die ook van het type integer is; normaal zouden de types moeten overeenkomen...
Waarom zegt de waarschuwing dat mapEntier[0] van het type "integer?" is en niet gewoon "integer"? Ter herinnering: het "?" aan het einde van een type betekent dat dit type ook de waarde null aanvaardt; het is een equivalent van "integer | null". Dus waarom zou mijn associatieve array een null-waarde kunnen teruggeven, terwijl hij volgens zijn type alleen integers bevat? Wanneer je een waarde uit een associatieve array wilt lezen, moet je er een sleutel aan doorgeven, hier de "0" tussen de vierkante haken; die sleutel moet van het type zijn dat in de associatieve array is gedefinieerd, hier een integer, dus op dat vlak is alles in orde. Maar niets garandeert de editor dat de sleutel in de associatieve array bestaat, en als je een associatieve array leest met een sleutel die niet bestaat, is het resultaat altijd null. Het resultaat van een toegang tot een associatieve array via een sleutel is dus altijd nullable. Laten we nu bekijken hoe we dit probleem oplossen om geen waarschuwingen meer te krijgen:
In dit geval heb ik een lijst van gehele getallen die ik wil sorteren; op het eerste gezicht niets ingewikkelds, ik neem zelfs het voorbeeld uit de documentatie over
Toch krijg ik 2 waarschuwingen op deze eenvoudige regel; laten we met de eerste beginnen: ze staat tussen haakjes, wat betekent dat het probleem zit bij de parameters van de functie, die niet aan de verwachte signatuur voldoen. Laten we de documentatie van arraySort bekijken om de signatuur te zien: Function real | integer> => Array> Het is dus een functie die 2 parameters verwacht: een lijst als eerste parameter, en als tweede parameter een functie die zelf ook 2 parameters neemt en een geheel of reëel getal teruggeeft. Als eerste parameter geven we inderdaad een lijst door, daar is niets mis mee; het is dus bij de tweede parameter dat er iets schort: we geven een functie door met als signatuur Function any>, terwijl arraySort Function real | integer> verwacht; het retourtype is niet het verwachte.
Het typeringsprobleem van de callback-functie is opgelost; nu blijft de tweede waarschuwing nog over. Zoals net gezien is het resultaat van de functie arraySort geen Array\ zoals we voor onze variabele verwachten, maar gewoon Array; we moeten het resultaat dus expliciet casten om dit probleem te verhelpen.
Impossible de charger les données du jeu.
Vérifiez votre connexion et réessayez.