Совместимость и устаревшие функции
Elixir имеет версионирование по схеме vMAJOR.MINOR.PATCH.
В настоящее время Elixir находится на основной версии v1. Каждый 6 месяцев происходит выпуск новой совместимой с предыдущими версиями дополнительной версии. Выпуски с исправлениями ошибок и патчи безопасности не планируются и производятся по мере необходимости.
Elixir исправляет ошибки только для последней дополнительной ветки. Патчи безопасности доступны для последних 5 дополнительных веток:
| Версия Elixir | Поддержка |
|---|---|
| 1.8 | Исправления ошибок и патчи безопасности |
| 1.7 | Только патчи безопасности |
| 1.6 | Только патчи безопасности |
| 1.5 | Только патчи безопасности |
| 1.4 | Только патчи безопасности |
О новых выпусках объявляется в только для чтения списке рассылки новостей. Все релизы с исправлениями безопасности будут помечены [security].
В настоящее время нет планов на выпуск основной версии v2.
Совместимость между версиями Elixir без изменения основной версии
Дополнения и исправления к версиям Elixir совместимы с предыдущими версиями: определённые поведения и документированные API в данной версии будут продолжать работать в будущих версиях.
Хотя ожидается, что подавляющее большинство программ останется совместимым со временем, невозможно гарантировать, что никакое будущее изменение не нарушит работу какой-либо программы. В некоторых маловероятных обстоятельствах мы можем внести изменения, которые нарушат существующий код:
-
Безопасность: может возникнуть проблема безопасности в реализации, решение которой требует несовместимых изменений. Мы оставляем за собой право решать такие проблемы безопасности.
-
Ошибки: если у API есть нежелательное поведение, программа, которая зависит от ошибочного поведения, может сломаться при исправлении ошибки. Мы оставляем за собой право исправлять такие ошибки.
-
Фронтенд компилятора: могут быть внесены улучшения в компилятор, вводя новые предупреждения для неоднозначных режимов и предоставление более подробных сообщений об ошибках. Это может привести к ошибкам компиляции (при запуске с
--warning-as-errors) или сбоям инструментов при утверждении определённых сообщений об ошибках (хотя следует избегать такого подхода). Мы оставляем за собой право проводить такие улучшения. -
Импорты: в модуль
Kernel, который импортируется автоматически, могут быть добавлены новые функции. Они могут конфликтовать с локальными функциями, определёнными в ваших модулях. Конфликты можно разрешить с обратной совместимостью, используяimport Kernel, except: [...]со списком всех функций, которые вы не хотите импортировать изKernel. Мы оставляем за собой право вносить такие дополнения.
Для продолжения развития языка без введения несовместимых изменений Elixir будет использовать устаревание для понижения некоторых практик и продвижения новых. Наша политика устаревания описана в разделе "Устаревшие функции".
Единственным исключением из вышеуказанных гарантий совместимости являются экспериментальные функции, которые будут явно помечены как таковые и не обеспечивают никакой гарантии совместимости до момента их стабилизации.
Совместимость между Elixir и Erlang/OTP
Версионирование Erlang/OTP не зависит от версионирования Elixir. Каждая версия Elixir поддерживает определённый диапазон версий Erlang/OTP. Таблица совместимости показана ниже.
| Версия Elixir | Поддерживаемые версии Erlang/OTP |
|---|---|
| 1.0 | 17 - 17 (и Erlang/OTP 18 с v1.0.5) |
| 1.1 | 17 - 18 |
| 1.2 | 18 - 18 (и Erlang/OTP 19 с v1.2.6) |
| 1.3 | 18 - 19 |
| 1.4 | 18 - 19 (и Erlang/OTP 20 с v1.4.5) |
| 1.5 | 18 - 20 |
| 1.6 | 19 - 20 (и Erlang/OTP 21 с v1.6.6) |
| 1.7 | 19 - 21 |
| 1.8 | 20 - 21 |
Хотя Elixir часто добавляет совместимость с новыми версиями Erlang/OTP в выпусках ветвей, таких как поддержка Erlang/OTP 20 в v1.4.5, эти релизы обычно содержат минимальные изменения для запуска Elixir без ошибок. Только следующий выпуск дополнительной версии, в данном случае v1.5.0, эффективно использует новые возможности, предоставляемые последним выпуском Erlang/OTP.
Устаревшие функции
Политика
Устаревание функций в Elixir происходит в 3 этапа:
-
Функция мягко устаревает. Это означает, что как в CHANGELOG, так и в документации функция должна быть указана как устаревшая, но при выполнении кода предупреждение не выводится. Требование к мягкому устареванию функции отсутствует.
-
Функция эффективно устаревает, вызывая предупреждения при использовании. Это также известно как жёсткое устаревание. Для устаревания функции предложенная альтернатива ДОЛЖНА существовать как минимум в течение двух дополнительных версий. Например,
Enum.uniq/2была мягко устаревшей в пользуEnum.uniq_by/2в Elixir v1.1. Это означает, что предупреждение об устаревании может быть выведено только Elixir v1.3 или более поздней версии. -
Функция удаляется. Это может произойти только при выпуске основной версии. Это означает, что устаревшие функции в Elixir v1.x должны быть удалены только в Elixir v2.x.
Таблица устаревших функций
| Устаревшая функция | Устаревшая с | Заменена на (доступна с) |
|---|---|---|
Передача непустого списка в Enum.into/2
|
v1.8 |
Kernel.++/2 или Keyword.merge/2 (v1.0) |
Передача непустого списка в :into в for
|
v1.8 |
Kernel.++/2 или Keyword.merge/2 (v1.0) |
:seconds, :milliseconds, и т. д. в качестве единиц времени |
v1.8 |
:second, :millisecond, и т. д. (v1.4) |
Inspect.Algebra.surround/3 |
v1.8 |
Inspect.Algebra.concat/2 и Inspect.Algebra.nest/2 (v1.0) |
Inspect.Algebra.surround_many/6 |
v1.8 |
Inspect.Algebra.container_doc/6 (v1.6) |
Kernel.ParallelCompiler.files/2 |
v1.8 |
Kernel.ParallelCompiler.compile/2 (v1.6) |
Kernel.ParallelCompiler.files_to_path/2 |
v1.8 |
Kernel.ParallelCompiler.compile_to_path/2 (v1.6) |
Kernel.ParallelRequire.files/2 |
v1.8 |
Kernel.ParallelCompiler.require/2 (v1.6) |
System.cwd/0 и System.cwd!/0
|
v1.8 |
File.cwd/0 и File.cwd!/0 (v1.0) |
mix compile.erlang возвращающее {:ok, contents} или :error в качестве обратного вызова в Mix.Compilers.Erlang.compile/6
|
v1.8 | Возвращайте {:ok, contents, warnings} или {:error, errors, warnings}
|
Code.get_docs/2 |
v1.7 |
Code.fetch_docs/1 (v1.7) |
Вызов super/1 для обратных вызовов GenServer |
v1.7 | Не вызывать super/1 (v1.0) |
Enum.chunk/2/3/4
|
v1.7 |
Enum.chunk_every/2/3/4 (v1.5) |
not left in right |
v1.7 |
left not in right (v1.5) |
Registry.start_link/3 |
v1.7 |
Registry.start_link/1 (v1.5) |
Stream.chunk/2/3/4
|
v1.7 |
Stream.chunk_every/2/3/4 (v1.5) |
Enum.partition/2 |
v1.6 |
Enum.split_with/2 (v1.4) |
Keyword.replace/3 |
v1.6 |
Keyword.fetch/2 + Keyword.put/3 (v1.0) |
Macro.unescape_tokens/1 и Macro.unescape_tokens/2
|
v1.6 | Используйте Enum.map/2 для обхода аргументов (v1.0) |
Module.add_doc/6 |
v1.6 |
@doc модуль атрибута (v1.0) |
Map.replace/3 |
v1.6 |
Map.fetch/2 + Map.put/3 (v1.0) |
Range.range?/1 |
v1.6 | Сопоставление с образцом _.._ (v1.0) |
Atom.to_char_list/1 |
v1.5 |
Atom.to_charlist/1 (v1.3) |
Enum.filter_map/3 |
v1.5 |
Enum.filter/2 + Enum.map/2 или for (v1.0) |
Float.to_char_list/1 |
v1.5 |
Float.to_charlist/1 (v1.3) |
GenEvent модуль |
v1.5 |
Supervisor и GenServer (v1.0);GenStage (v1.3);:gen_event (Erlang/OTP 17) |
Integer.to_char_list/1 и Integer.to_char_list/2
|
v1.5 |
Integer.to_charlist/1 и Integer.to_charlist/2 (v1.3) |
Kernel.to_char_list/1 |
v1.5 |
Kernel.to_charlist/1 (v1.3) |
List.Chars.to_char_list/1 |
v1.5 |
List.Chars.to_charlist/1 (v1.3) |
Stream.filter_map/3 |
v1.5 |
Stream.filter/2 + Stream.map/2 (v1.0) |
String.ljust/3 и String.rjust/3
|
v1.5 | Используйте String.pad_leading/3 и String.pad_trailing/3 с двоичным заполнением (v1.3) |
String.strip/1 и String.strip/2
|
v1.5 |
String.trim/1 и String.trim/2 (v1.3) |
String.lstrip/1 и String.rstrip/1
|
v1.5 |
String.trim_leading/1 и String.trim_trailing/1 (v1.3) |
String.lstrip/2 и String.rstrip/2
|
v1.5 | Используйте String.trim_leading/2 и String.trim_trailing/2 с бинарным значением в качестве второго аргумента (v1.3) |
String.to_char_list/1 |
v1.5 |
String.to_charlist/1 (v1.3) |
() означает nil
|
v1.5 |
nil (v1.0) |
char_list/0 тип |
v1.5 |
charlist/0 тип (v1.3) |
:char_lists ключ в типе Inspect.Opts.t/0 |
v1.5 |
:charlists ключ (v1.3) |
:as_char_lists значение в типе Inspect.Opts.t/0 |
v1.5 |
:as_charlists значение (v1.3) |
@compile {:parse_transform, _} в модуле Module
|
v1.5 | Нет |
EEx: <%= в выражениях посередине и в конце |
v1.5 | Используйте <% (<%= разрешено только для выражений в начале) (v1.0) |
Access.key/1 |
v1.4 |
Access.key/2 (v1.3) |
Behaviour модуль |
v1.4 |
@callback атрибут модуля (v1.0) |
Enum.uniq/2 |
v1.4 |
Enum.uniq_by/2 (v1.2) |
Float.to_char_list/2 |
v1.4 |
:erlang.float_to_list/2 (Erlang/OTP 17) |
Float.to_string/2 |
v1.4 |
:erlang.float_to_binary/2 (Erlang/OTP 17) |
HashDict модуль |
v1.4 |
Map (v1.2) |
HashSet модуль |
v1.4 |
MapSet (v1.1) |
Псевдонимы из нескольких букв в OptionParser
|
v1.4 | Используйте псевдонимы из одной буквы (v1.0) |
Set модуль |
v1.4 |
MapSet (v1.1) |
Stream.uniq/2 |
v1.4 |
Stream.uniq_by/2 (v1.2) |
IEx.Helpers.import_file/2 |
v1.4 |
IEx.Helpers.import_file_if_available/1 (v1.3) |
Mix.Utils.camelize/1 |
v1.4 |
Macro.camelize/1 (v1.2) |
Mix.Utils.underscore/1 |
v1.4 |
Macro.underscore/1 (v1.2) |
| Переменная, используемая как вызов функции | v1.4 | Используйте скобки (v1.0) |
Анонимные функции без выражения после ->
|
v1.4 | Используйте выражение или явно возвращайте nil (v1.0) |
| Поддержка возможности сделать частные функции переопределяемыми | v1.4 | Используйте публичные функции (v1.0) |
Dict модуль |
v1.3 |
Keyword (v1.0) или Map (v1.2) |
Keyword.size/1 |
v1.3 |
Kernel.length/1 (v1.0) |
Map.size/1 |
v1.3 |
Kernel.map_size/1 (v1.0) |
Set поведение |
v1.3 |
MapSet структура данных (v1.1) |
String.valid_character?/1 |
v1.3 |
String.valid?/1 (v1.0) |
Task.find/2 |
v1.3 | Используйте непосредственное сопоставление сообщений (v1.0) |
:append_first параметр в Kernel.defdelegate/2
|
v1.3 | Определите функцию явно (v1.0) |
/r параметр в Regex
|
v1.3 |
/U (v1.1) |
\x{X*} внутри строк/сигилов/списков символов |
v1.3 |
\uXXXX или \u{X*} (v1.1) |
Словарь или словарь в качестве второго аргумента в Enum.group_by/3
|
v1.3 |
Enum.reduce/3 (v1.0) |
Не словарь в качестве второго аргумента в URI.decode_query/2
|
v1.3 | Используйте словарь (v1.0) |
Dict поведение |
v1.2 |
MapSet структура данных (v1.1) |
Access протокол |
v1.1 |
Access поведение (v1.1) |
as: true | false в alias/2 и require/2
|
v1.1 | Ничего |
?\xHEX |
v1.1 |
0xHEX (v1.0) |
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.8.2/compatibility-and-deprecations.html