Вопрос

В язык взлома система типов, существует ли тип "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 быть универсальным местом для подобных материалов, но в документах определенно есть пробелы, на которые, как мы надеемся, помогут указать умные, увлеченные люди вроде вас.(т. е. я думал, что этот материал был хорошо объяснен в документах, но поскольку вы в замешательстве, это явно не так, и мы были бы очень признательны за отчет об ошибке с подробным описанием того, где вы заблудились.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top