Elixir — динамически типизированный функциональный язык для написания распределенных и параллельных приложений разработанный как альтернатива Erlang и работающий на Erlang VM.
Версия 1.8 содержит множество изменений на уровне инфраструктуры, времени компиляции и добавляет новые возможности интроспектирования системы.
Главные изменения:
- Кастомизированный вывод структур.
Теперь можно использовать протокол
Inspect
для указания полей, которые будут использоваться для форматирования структуры в строку, так что структураdefmodule User do @derive {Inspect, only: [:id, :name, :age]} defstruct [:id, :name, :age, :email, :encrypted_password] end
будет напечатана следующим образом:
#User<id: 1, name: "Jane", age: 33, ...>
- Теперь Elixir поддерживает базу часовых поясов
В языке существуют 4 типа данных для работы со временем:
Time
,Date
,NativeDateTime
(время без часового пояса) иDateTime
(с часовым поясом). Развитию последнего препятствовало отсутствие поддержки базы часовых поясов.Теперь появился интерфейс
Calendar.TimeZoneDatabase
который позволит разработчикам подключать свои собственные базы часовых поясов. Так же это позволяет добавить новые возможности, вDateTime
, напримерDateTime.shift_zone/3
.Также добавлены функции
Date.day_of_year/1
,Date.quarter_of_year/1
,Date.year_of_era/1
andDate.day_of_era/1
. - Добавлен ключ
$callers
для улучшения возможностей инструментарияОдним из самых распространенных способов запуска процессов является модуль
Task
. При этом Elixir сохраняет идентификатор процесса родителя в словаре запущенного процесса по ключу$ancestors
. Это позволяет утилитам анализировать систему и прослеживать происхождение различный событий. Однако этого недостаточно, так как часто дочерний процесс запускается не напрямую, а через посредника, напримерsupervisor
. В таком случае хоть ваш код и вызывает запускTask
, однако, родителем будет указан процесс супервизора.В новой версии Elixir добавлен ключ
$callers
который указывает на оригинальный процесс, вызвывший запускTask
.Например, при таком вызове:
[your code] -- calls --> [supervisor] ---- spawns --> [task]
В
$callers
будет сохранен идентификатор изначального процесса:[your code] [supervisor] <-- ancestor -- [task] ^ | |--------------------- caller ---------------------|