Zrozumienie ostrzeżeń trybu ścisłego

Zrozumienie ostrzeżeń trybu ścisłego

> LeekScript samouczek

Zdecydowałeś się przejść na tryb ścisły, a edytor zalewa cię mnóstwem ostrzeżeń, których wcześniej nie było. Bez paniki — na tym właśnie polega tryb ścisły: jest mniej pobłażliwy i zostawia mniej swobody, zwłaszcza w kwestii typowania. Przyjrzyjmy się kilku typowym przypadkom zgłaszanych ostrzeżeń, aby najpierw zrozumieć, na czym polega problem, a potem znaleźć sposoby, by mu zaradzić.

Niebezpieczna konwersja z typu « real » do « integer »

Pierwszy, prosty przypadek: chcę zapisać wynik obliczenia w zmiennej typu całkowitego.

Problem polega na tym, że funkcja sqrt zawsze zwraca wartość typu rzeczywistego, nawet jeśli matematycznie sqrt(4) wynosi 2. A liczba rzeczywista nie mieści się bez straty w zmiennej typu całkowitego: co zrobić na przykład z częścią ułamkową sqrt(2)? Kompilator wymaga więc dokonania jawnego wyboru. Istnieje kilka sposobów rozwiązania tego ostrzeżenia:

Niebezpieczna konwersja z typu « integer? » do « integer »

Inny przypadek: mam tablicę asocjacyjną (Map) liczb całkowitych zdefiniowaną jak poniżej i chcę zapisać wartość z tej tablicy w zmiennej również typu całkowitego — teoretycznie typy powinny się zgadzać...

Dlaczego ostrzeżenie mówi nam, że mapEntier[0] jest typu «integer?», a nie po prostu «integer»? Przypomnijmy: «?» na końcu typu oznacza, że typ ten przyjmuje również wartość null — to odpowiednik «integer | null». Dlaczego więc moja tablica asocjacyjna miałaby zwrócić null, skoro według swojego typu zawiera wyłącznie integer? Aby odczytać wartość z tablicy asocjacyjnej, trzeba podać jej klucz — tutaj «0» w nawiasach kwadratowych; klucz ten musi być typu zdefiniowanego w tablicy asocjacyjnej, tu integer, więc na tym poziomie wszystko jest w porządku. Nic jednak nie gwarantuje edytorowi, że klucz istnieje w tablicy asocjacyjnej, a odczyt z tablicy asocjacyjnej po nieistniejącym kluczu zawsze zwraca null. Dlatego wynik dostępu do tablicy asocjacyjnej po kluczu jest zawsze typu nullable. Zobaczmy teraz, jak rozwiązać ten problem, aby pozbyć się ostrzeżeń:

Niebezpieczna konwersja z typu « (Array, Function any>) » do « () »

W tym przypadku mam listę liczb całkowitych, którą chcę posortować — z pozoru nic skomplikowanego, biorę nawet przykład z dokumentacji

A jednak na tej prostej linii dostaję 2 ostrzeżenia. Zacznijmy od pierwszego: jest ujęte w nawiasy, co oznacza, że problem dotyczy parametrów funkcji, które nie odpowiadają oczekiwanej sygnaturze. Zajrzyjmy do dokumentacji arraySort, aby zobaczyć jej sygnaturę: Function real | integer> => Array> Jest to więc funkcja oczekująca 2 parametrów: listy jako pierwszego parametru oraz, jako drugiego, funkcji, która również przyjmuje 2 parametry i zwraca liczbę całkowitą lub rzeczywistą. Jako pierwszy parametr przekazujemy faktycznie listę, więc tu nie ma problemu; coś jest zatem nie tak z drugim parametrem: przekazujemy funkcję o sygnaturze Function any>, podczas gdy arraySort oczekuje Function real | integer> — typ zwracany nie jest tym, którego oczekiwano.

Problem z typowaniem funkcji zwrotnej został rozwiązany; pozostaje jeszcze drugie ostrzeżenie. Jak widzieliśmy przed chwilą, wartość zwracana przez arraySort nie jest Array\, jak oczekujemy dla naszej zmiennej, lecz po prostu Array — trzeba więc jawnie rzutować wynik, aby naprawić ten problem.