Хакланг: почему классы контейнеров были заменены встроенными типами? - PullRequest
1 голос
/ 18 января 2020

Просто цитата из хакерской документации:

Legacy Vector, Map и Set

Эти типы контейнеров следует избегать в новом коде; вместо этого используйте dict, keyset и ve c.

В начале жизни Хака библиотека предоставляла непостоянные и неизменные типы классов generi c, называемые: Vector, ImmVector, Map, ImmMap, Set и ImmSet. Однако их заменили ve c, dict и keyset, использование которых рекомендуется во всем новом коде. Каждый тип generi c имел соответствующую буквальную форму. Например, переменная типа Vector может быть инициализирована с использованием Vector {22, 33, $ v}, где $ v - это переменная типа int.

Интересно, почему это изменение было сделано. Я имею в виду, одна из слабостей PHP в том, что у нее плохая oop стандартная библиотека. Например: str_replace и array_values методы находятся вне самого типа строка / массив. Стандартная библиотека PHP не согласована, иногда мы должны передавать массив в качестве первого параметра, а иногда в качестве второго ...

Я был рад видеть, что Hack ввел истинную инкапсуляцию OOP для коллекций .
Знаете ли вы, почему они отступили и написали служебные классы, такие как C\, Dict\, Keyset\ и Vec\?
Будет ли в будущем добавление для добавления методов к встроенным в типах (например: Str\starts_with => "toto"->startsWith("t"))?

1 Ответ

3 голосов
/ 19 января 2020

На основании сообщения в блоге Дуэйна Ривза, в котором описывается HSL , кажется, что основным преимуществом является тот факт, что массивы - это собственные значения, а не объекты. Это имеет два важных следствия:

  1. Для пользователей семантика отличается, когда значения пересекают аргументы. Объекты передаются как ссылки, а мутации влияют на исходный объект. С другой стороны, значения копируются при записи после прохождения через аргументы, поэтому без ссылок (которые окончательно полностью запрещены в Hack ) вызываемый не может изменить значение вызывающей стороны, за исключением из гораздо более строгих параметров inout .

    В статье цитируется неизменность изменяемых контейнеров (Vector, Set и т. д. c.) и в целом то, как совместно используемые пары изменяемого состояния функционируют ближе друг к другу. Проблемы надежности, о которых говорилось в статье, несколько спорны, потому что были также неизменяемыми контейнерами объектов (ImmVector, ImmSet и др. c.), Хотя, поскольку эти интерфейсы были написаны в пользовательском пространстве, дисперсия заключила в оболочку тип функции подпись в жестких условиях. От этого есть ощутимые отличия: ImmMap<Tk, +Tv> инвариантен в Tk исключительно из-за получателя (function(Tk): Tv). Между тем, dict<+Tk, +Tv> является ковариантным в обоих параметрах типа благодаря встроенной защите мутаций от копирования при записи.

  2. Для компилятора значения stati c могут быть быстро выделены и сохраняться в течение всего срока службы сервера. Объекты, с другой стороны, имеют произвольно сложные подпрограммы конструирования в целом, и, кажется, что объекты коллекции не собираются быть в специальном корпусе.

Я также упомяну, что для большинства случаев использования , есть минимальная разница даже в стиле кода: например, цепочки ссылок -> могут быть непосредственно заменены оператором |> . Также больше нет границы между привилегированными «стандартными функциями» и пользовательскими функциями в типах коллекций. Наконец, типы коллекций были, конечно, final, поэтому их объективный характер не давал конечному пользователю каких-либо реальных иерархических или полиморфных c преимуществ.

...