Какой тип является верхним в языке взлома?
-
21-12-2019 - |
Вопрос
В язык взлома система типов, существует ли тип "top", также известный как тип "any", или универсальный тип "Object"?То есть тип, все типы которого являются подклассами?
В руководстве упоминаются "смешанные" типы, которые могут быть похожи, но на самом деле не объяснены.Существует также возможность просто опустить объявление типа в некоторых местах.Однако это не может быть сделано везде, напримересли я хочу объявить что-то функцией из string
для верхнего типа непонятно, как я это делаю. function (string): mixed
?
Решение
Я инженер, работающий над взломом Facebook.Это действительно проницательный и интересный вопрос.В зависимости от того, к чему именно вы клоните, у Hack есть пара различных вариантов этого.
Во-первых, давайте поговорим о mixed
.Это супертип всего сущего.Например, этот тип проверяет:
<?hh // strict
function f(): mixed {
return 42;
}
Но поскольку это супертип всего сущего, вы мало что можете сделать с помощью mixed
значение до тех пор, пока вы не проанализируете, что это на самом деле, через is_int
, instanceof
, и т.д.Вот пример того, как вы должны были бы использовать результат f()
:
<?hh // strict
function g(): int {
$x = f();
if (is_int($x)) {
return $x;
} else {
return 0;
}
}
Тип "отсутствующей аннотации" ("any") несколько отличается от этого.Принимая во внимание , что mixed
является супертипом всего сущего, "любого". объединяет со всем - это и то, и другое является супертипом и подтип всего сущего.Это означает, что если вы опустите аннотацию, мы будем считать, что вы знаете, что делаете, и просто пропустим это мимо ушей.Например, следующий код проверяет тип, как написано:
<?hh
// No "strict" since we are omitting annotations
function f2() {
return 42;
}
function g2(): string {
return f2();
}
Это явно неразумно - мы просто нарушили систему типов и вызовем ошибку типа во время выполнения, если мы выполним приведенный выше код - но это допускается в частичном режиме, чтобы упростить преобразование.Strict требует, чтобы вы комментировали все, и поэтому вы не можете получить значение типа "any", чтобы таким образом нарушить систему типов, если весь ваш код написан в strict.Подумайте, как вам пришлось бы комментировать приведенный выше код в строгом режиме:либо f2
пришлось бы вернуться int
и это было бы прямой ошибкой типа ("string несовместима с int"), или f2
пришлось бы вернуться mixed
и это было бы ошибкой типа, как написано ("строка несовместима со смешанным"), пока вы не провели анализ случая с помощью is_int
и т.д., как я делал в моем предыдущем примере.
Надеюсь, это прояснит ситуацию - если вам нужны разъяснения, дайте мне знать в комментариях, и я отредактирую.И если у вас есть другие вопросы, которые не являются строгими разъяснениями этого, продолжайте отмечать их "hacklang", и мы позаботимся о том, чтобы на них были даны ответы!
Наконец-то:если вы не возражаете, не могли бы вы нажать кнопку "сообщить об ошибке в документации" на страницах документов, которые были запутанными или неясными, или которые можно было каким-либо образом улучшить?В идеале мы хотим docs.hhvm.com быть универсальным местом для подобных материалов, но в документах определенно есть пробелы, на которые, как мы надеемся, помогут указать умные, увлеченные люди вроде вас.(т. е. я думал, что этот материал был хорошо объяснен в документах, но поскольку вы в замешательстве, это явно не так, и мы были бы очень признательны за отчет об ошибке с подробным описанием того, где вы заблудились.)