Jestem inżynierem pracującym na Hack na Facebooku. To naprawdę wnikliwe i interesujące pytanie. W zależności od tego, co dokładnie robisz, Hack ma kilka różnych odmian tego.
Po pierwsze, porozmawiajmy o mixed
. Jest to supertype wszystkiego. Na przykład ten typechecks:
<?hh // strict
function f(): mixed {
return 42;
}
Ale ponieważ jest to supertypem wszystkiego, nie można zrobić wiele o wartości mixed
aż przypadek analizować tego, co jest w rzeczywistości, poprzez is_int
, instanceof
, itd. Oto przykładem tego, jak trzeba by użyć wyniku f()
:
<?hh // strict
function g(): int {
$x = f();
if (is_int($x)) {
return $x;
} else {
return 0;
}
}
„brakującego adnotacja” typ („any”) jest nieco inna niż ta. Podczas gdy mixed
jest nadtypem wszystkiego, "każdy" jednoczy ze wszystkim - jest podtypem wszystkiego podtypu i. Oznacza to, że jeśli zostawisz adnotację, zakładamy, że wiesz, co robisz i po prostu ją przepuszczasz. Na przykład, następujące typechecks code jak napisano:
<?hh
// No "strict" since we are omitting annotations
function f2() {
return 42;
}
function g2(): string {
return f2();
}
Nie jest to oczywiście dźwięk - po prostu złamał system typu i spowoduje błąd typu Runtime jeśli wykonujemy powyższy kod - ale to dopuszczone w tryb częściowy w celu ułatwienia konwersji. Strict wymaga adnotacji wszystkiego, a więc nie można uzyskać wartości typu "any" w celu złamania systemu typu w ten sposób, jeśli cały kod jest ścisły. Zastanów się, w jaki sposób musiałbyś opisać powyższy kod w trybie ścisłym: albo f2
musiałby zwrócić int
i byłby to błąd typu straight-up ("ciąg nie jest zgodny z int"), albo f2
musiałby zwrócić mixed
i byłby to błąd typu zapisany ("ciąg nie jest zgodny z mieszanym"), dopóki nie wykonałeś analizy przypadku z is_int
itd., tak jak w moim wcześniejszym przykładzie.
Mam nadzieję, że to wszystko wyjaśni - jeśli chcesz wyjaśnić, daj mi znać w komentarzach, a ja to zmienię. A jeśli masz inne pytania, które nie stanowią ścisłych wyjaśnień, kontynuuj oznaczanie ich tagami "hacklang", a my upewnimy się, że na nie odpowiedzą!
Wreszcie: jeśli nie miałbyś nic przeciwko, czy możesz nacisnąć przycisk "błąd dokumentacji" na stronach dokumentów, które były mylące lub niejasne, lub w jakikolwiek sposób można je poprawić? Idealnie chcemy, aby docs.hhvm.com było miejscem, w którym można umieścić takie rzeczy, ale są pewne dziury w dokumentach, które mamy nadzieję, że mądrzy, entuzjastyczni ludzie tacy jak ty pomogą wskazać. (tj., myślałem, że to zostało dobrze wyjaśnione w dokumentach, ale ponieważ jesteś zdezorientowany, to oczywiście nie jest to prawdą, i naprawdę docenilibyśmy raport o błędach, w którym zgubiłeś się.)
Świetna odpowiedź, dzięki! Niektóre wyjaśnienia: (1) Za każdym razem, gdy pominięto adnotację, jest to równoważne z ': any'?(2) tryb "ścisły" powinien być w dobrym stanie, ale inne tryby są celowo niewłaściwe; czy to jest poprawne? Byłoby wspaniale, gdybyś mógł bardziej oficjalnie opublikować biały dokument opisujący system typów. Wydaje się, że system typu Hack jest na tyle innowacyjny, że zasługuje na coś takiego. Re błędów dokumentacji: zrobi! – jameshfisher
1) Brak adnotacji jest typem "any", ale nie ma typu "any", który można jawnie napisać w kodzie. 2) Inne tryby są "celowo niesłuszne" to jeden ze sposobów, aby je wyrazić, ale myślimy o tym bardziej jako "dopisywanie dynamicznego typowania" i "zezwalaj na opóźnianie wymuszania typów do czasu wykonania" i "zezwalaj na pełną nieopisaną interoperacyjność PHP". Nie jestem pewien, czy mamy plan napisania białej księgi, czy cokolwiek, ale może powinniśmy, ponieważ wiele osób jest zainteresowanych :) Najnowsza rozmowa Hack Dev Day Juliena przechodzi do szczegółów wewnętrznych w drugiej połowie: https: // www .youtube.com/watch? v = BnJQJNGkUdM –
Czy chodzi o punkt (1), czy to prawda? Więc co się dzieje w [tym przykładzie] (http://pastebin.com/wRXJLGQc), który typ sprawdza i działa bez błędu? Czy "dowolne" jest interpretowane tak, jak opisałeś powyżej, lub jako jakiś nieznany zwykły typ o nazwie "any", który w jakiś sposób nie generuje błędu typu? – jameshfisher