Совместимость и устаревшие функции
Версии Elixir имеют схему vMAJOR.MINOR.PATCH.
В настоящее время Elixir находится на версии 1. Новый обратный совместимый выпуск minor происходит каждые 6 месяцев. Выпуски patch не планируются и выполняются при наличии исправлений ошибок или патчей безопасности.
Elixir применяет исправления ошибок только к последней ветке minor. Патчи безопасности доступны для последних 5 minor веток:
| Версия Elixir | Поддержка |
|---|---|
| 1.13 | Исправления ошибок и патчи безопасности |
| 1.12 | Только патчи безопасности |
| 1.11 | Только патчи безопасности |
| 1.10 | Только патчи безопасности |
| 1.9 | Только патчи безопасности |
О новых выпусках объявляется в списке рассылки объявлений. Все выпуски с исправлениями безопасности будут помечены [security].
В настоящее время нет планов по выпуску основной версии v2.
Совместимость между версиями Elixir без изменения главной версии
Выпуски Elixir minor и patch обратно совместимы: хорошо определенное поведение и документированные API в данной версии будут продолжать работать в будущих версиях.
Хотя мы ожидаем, что подавляющее большинство программ останутся совместимыми со временем, невозможно гарантировать, что какое-либо будущее изменение не повлияет на работу какой-либо программы. В некоторых маловероятных обстоятельствах мы можем внести изменения, которые повлияют на существующий код:
Безопасность: может возникнуть проблема безопасности в реализации, решение которой требует изменений, не совместимых с предыдущими версиями. Мы оставляем за собой право устранять такие проблемы безопасности.
Ошибки: если у API есть нежелательное поведение, программа, которая зависит от этого ошибочного поведения, может сломаться, если ошибка будет исправлена. Мы оставляем за собой право исправлять такие ошибки.
Фронтенд компилятора: могут быть внесены улучшения в компилятор, вводя новые предупреждения для неоднозначных режимов и предоставляя более подробные сообщения об ошибках. Это может привести к ошибкам компиляции (при запуске с
--warning-as-errors) или сбоям инструментов при утверждении определенных сообщений об ошибках (хотя следует избегать такого). Мы оставляем за собой право вносить такие улучшения.Импорты: могут быть добавлены новые функции в модуль
Kernel, который импортируется автоматически. Они могут конфликтовать с локальными функциями, определенными в ваших модулях. Коллизии можно разрешить обратной совместимостью с помощьюimport Kernel, except: [...]со списком всех функций, которые вы не хотите импортировать изKernel. Мы оставляем за собой право добавлять такие функции.
Чтобы продолжать развитие языка без введения несовместимых изменений, Elixir будет полагаться на устаревшие функции для снижения значимости определенных практик и продвижения новых. Наша политика устаревания функций описана в разделе "Устаревшие функции".
Исключением из вышеприведенных гарантий совместимости являются экспериментальные функции, которые будут явно помечены как таковые и не предоставляют гарантии совместимости, пока они не будут стабилизированы.
Совместимость между Elixir и Erlang/OTP
Версии Erlang/OTP независимы от версий Elixir. Erlang выпускает новую основную версию ежегодно. Наша цель — поддерживать последние три основные версии Erlang к моменту выпуска Elixir. Таблица совместимости представлена ниже.
| Версия Elixir | Поддерживаемые версии Erlang/OTP |
|---|---|
| 1.13 | 22 - 24 |
| 1.12 | 22 - 24 |
| 1.11 | 21 - 23 (и Erlang/OTP 24 с v1.11.4) |
| 1.10 | 21 - 22 (и Erlang/OTP 23 с v1.10.3) |
| 1.9 | 20 - 22 |
| 1.8 | 20 - 22 |
| 1.7 | 19 - 22 |
| 1.6 | 19 - 20 (и Erlang/OTP 21 с v1.6.6) |
| 1.5 | 18 - 20 |
| 1.4 | 18 - 19 (и Erlang/OTP 20 с v1.4.5) |
| 1.3 | 18 - 19 |
| 1.2 | 18 - 18 (и Erlang/OTP 19 с v1.2.6) |
| 1.1 | 17 - 18 |
| 1.0 | 17 - 17 (и Erlang/OTP 18 с v1.0.5) |
Обратите внимание, что Elixir может добавить совместимость с новыми версиями Erlang/OTP в выпусках patch, например, поддержку Erlang/OTP 20 в v1.4.5. Эти выпуски сделаны для удобства и обычно содержат минимальные изменения для работы Elixir без ошибок, если такие изменения необходимы. Только последующий выпуск minor, в данном случае v1.5.0, эффективно использует новые возможности последней версии Erlang/OTP.
Устаревшие функции
Политика
Устаревание функций в Elixir происходит в 3 этапа:
Функция мягко устаревает. Это означает, что как CHANGELOG, так и документация должны указывать на устаревание функции, но при выполнении кода предупреждения не выдаются. Нет требования к мягкому устареванию функции.
Функция эффективно устаревает, вызывая предупреждения при использовании. Это также известно как жёсткое устаревание. Для устаревания функции предлагаемая альтернатива ДОЛЖНА существовать минимум три minor версии. Например,
Enum.uniq/2была мягко устаревшей в пользуEnum.uniq_by/2в Elixir v1.1. Это означает, что предупреждение об устаревании может быть выведено только Elixir v1.4 или более поздней версии.Функция удаляется. Это может произойти только в выпусках major. Это означает, что устаревшие функции в Elixir v1.x будут удалены только в Elixir v2.x.
Таблица устаревших функций
Первый столбец — версия, в которой функция была жёстко устаревшей. Второй столбец кратко описывает устаревшую функцию, а третий столбец поясняет замену и с какой версии замена доступна.
| Версия | Устаревшая функция | Заменена на (доступно с) |
|---|
| v1.13 |
! и != в требованиях к версии |
~> или >= (v1.0) |
| v1.13 | Mix.Config |
Config (v1.9) |
| v1.13 |
:strip_beam конфигурацию в mix escript.build
|
:strip_beams (v1.9) |
| v1.13 | Macro.to_string/2 |
Macro.to_string/1 (v1.0) |
| v1.13 | System.get_pid/0 |
System.pid/0 (v1.9) |
| v1.12 | ^^^/2 |
bxor/2 (v1.0) |
| v1.12 | @foo() для чтения атрибутов модуля |
Удалить скобки (v1.0) |
| v1.12 | use EEx.Engine |
Явно делегировать в EEx.Engine (v1.0) |
| v1.12 |
:xref компилятора в Mix |
Ничего (он всегда выполняется как часть компилятора сейчас) |
| v1.11 | Mix.Project.compile/2 |
Mix.Task.run("compile", args) (v1.0) |
| v1.11 |
Supervisor.Spec.worker/3 и Supervisor.Spec.supervisor/3
|
Новые спецификации дочерних процессов, описанные в Supervisor (v1.5) |
| v1.11 |
Supervisor.start_child/2 и Supervisor.terminate_child/2
|
DynamicSupervisor (v1.6) |
| v1.11 | System.stacktrace/1 |
__STACKTRACE__ в try/catch/rescue (v1.7) |
| v1.10 | Code.ensure_compiled?/1 |
Code.ensure_compiled/1 (v1.0) |
| v1.10 | Code.load_file/2 |
Code.require_file/2 (v1.0) или Code.compile_file/2 (v1.7) |
| v1.10 | Code.loaded_files/0 |
Code.required_files/0 (v1.7) |
| v1.10 | Code.unload_file/1 |
Code.unrequire_files/1 (v1.7) |
| v1.10 | Передача значений, не являющихся строками, в Logger.log/2
|
Явно преобразовать в строку с помощью to_string/1 (v1.0) |
| v1.10 |
:compile_time_purge_level в приложении Logger |
:compile_time_purge_matching в приложении Logger (v1.7) |
| v1.10 | Supervisor.Spec.supervise/2 |
Новые спецификации дочерних процессов, описанные в Supervisor (v1.5) |
| v1.10 |
:simple_one_for_one стратегия в Supervisor
|
DynamicSupervisor (v1.6) |
| v1.10 |
:restart и :shutdown в Task.Supervisor.start_link/1
|
:restart и :shutdown в Task.Supervisor.start_child/3 (v1.6) |
| v1.9 | Ключи Enumerable в Map.drop/2, Map.split/2 и Map.take/2
|
Вызовите Enum.to_list/1 на втором аргументе предварительно (v1.0) |
| v1.9 | Mix.Project.load_paths/1 |
Mix.Project.compile_path/1 (v1.0) |
| v1.9 | Передача :insert_replaced в String.replace/4
|
Используйте :binary.replace/4 (v1.0) |
| v1.8 | Передача непустого списка в Collectable.into/1
|
Kernel.++/2 или Keyword.merge/2 (v1.0) |
| v1.8 | Передача непустого списка в :into в for
|
Kernel.++/2 или Keyword.merge/2 (v1.0) |
| v1.8 | Передача непустого списка в Enum.into/2
|
Kernel.++/2 или Keyword.merge/2 (v1.0) |
| v1.8 | Единицы времени во множественном числе, такие как: :seconds, :milliseconds, и т.п. |
Используйте единственное число, например: :second, :millisecond, и т.д. (v1.4) |
| v1.8 | Inspect.Algebra.surround/3 |
Inspect.Algebra.concat/2 и Inspect.Algebra.nest/2 (v1.0) |
| v1.8 | Inspect.Algebra.surround_many/6 |
Inspect.Algebra.container_doc/6 (v1.6) |
| v1.9 |
--detached в Kernel.CLI
|
--erl "-detached" (v1.0) |
| v1.8 | Kernel.ParallelCompiler.files/2 |
Kernel.ParallelCompiler.compile/2 (v1.6) |
| v1.8 | Kernel.ParallelCompiler.files_to_path/2 |
Kernel.ParallelCompiler.compile_to_path/2 (v1.6) |
| v1.8 | Kernel.ParallelRequire.files/2 |
Kernel.ParallelCompiler.require/2 (v1.6) |
| v1.8 | Возвращение {:ok, contents} или :error из обратного вызова Mix.Compilers.Erlang.compile/6 |
Возврат {:ok, contents, warnings} или {:error, errors, warnings} (v1.6) |
| v1.8 |
System.cwd/0 и System.cwd!/0
|
File.cwd/0 и File.cwd!/0 (v1.0) |
| v1.7 | Code.get_docs/2 |
Code.fetch_docs/1 (v1.7) |
| v1.7 | Enum.chunk/2,3,4 |
Enum.chunk_every/2 и Enum.chunk_every/3,4 (v1.5) |
| v1.7 | Вызов super/1 вGenServer обратных вызовах |
Реализация поведения явно без вызова super/1 (v1.0) |
| v1.7 | not left in right |
left not in right (v1.5) |
| v1.7 | Registry.start_link/3 |
Registry.start_link/1 (v1.5) |
| v1.7 | Stream.chunk/2,3,4 |
Stream.chunk_every/2 и Stream.chunk_every/3,4 (v1.5) |
| v1.6 | Enum.partition/2 |
Enum.split_with/2 (v1.4) |
| v1.6 | Macro.unescape_tokens/1,2 |
Используйте Enum.map/2 для обхода аргументов (v1.0) |
| v1.6 | Module.add_doc/6 |
@doc модуль атрибут (v1.0) |
| v1.6 | Range.range?/1 |
Сопоставление с образцом для _.._ (v1.0) |
| v1.5 |
() означает nil
|
nil (v1.0) |
| v1.5 |
char_list/0 тип |
charlist/0 тип (v1.3) |
| v1.5 | Atom.to_char_list/1 |
Atom.to_charlist/1 (v1.3) |
| v1.5 | Enum.filter_map/3 |
Enum.filter/2 + Enum.map/2 или for выражения (v1.0) |
| v1.5 | Float.to_char_list/1 |
Float.to_charlist/1 (v1.3) |
| v1.5 |
GenEvent модуль |
Supervisor и GenServer (v1.0);<br/>GenStage (v1.3);<br/>:gen_event (Erlang/OTP 17) |
| v1.5 |
<%= в средних и конечных выражениях в EEx
|
Используйте <% (<%= разрешено только в начальных выражениях) (v1.0) |
| v1.5 |
:as_char_lists значение в Inspect.Opts.t/0 типе |
:as_charlists значение (v1.3) |
| v1.5 |
:char_lists ключ в Inspect.Opts.t/0 типе |
:charlists ключ (v1.3) |
| v1.5 | Integer.to_char_list/1,2 |
Integer.to_charlist/1 и Integer.to_charlist/2 (v1.3) |
| v1.5 | Kernel.to_char_list/1 |
Kernel.to_charlist/1 (v1.3) |
| v1.5 | List.Chars.to_char_list/1 |
List.Chars.to_charlist/1 (v1.3) |
| v1.5 |
@compile {:parse_transform, _} в Module
|
Нет |
| v1.5 | Stream.filter_map/3 |
Stream.filter/2 + Stream.map/2 (v1.0) |
| v1.5 |
String.ljust/3 и String.rjust/3
|
Используйте String.pad_leading/3 и String.pad_trailing/3 с двоичным заполнением (v1.3) |
| v1.5 |
String.lstrip/1 и String.rstrip/1
|
String.trim_leading/1 и String.trim_trailing/1 (v1.3) |
| v1.5 |
String.lstrip/2 и String.rstrip/2
|
Используйте String.trim_leading/2 и String.trim_trailing/2 с бинарным значением во втором аргументе (v1.3) |
| v1.5 |
String.strip/1 и String.strip/2
|
String.trim/1 и String.trim/2 (v1.3) |
| v1.5 | String.to_char_list/1 |
String.to_charlist/1 (v1.3) |
| v1.4 |
Анонимные функции без выражения после ->
|
Используйте выражение или явно верните nil (v1.0) |
| v1.4 | Поддержка переопределения приватных функций | Используйте публичные функции (v1.0) |
| v1.4 | Переменная, используемая как вызов функции | Используйте скобки (v1.0) |
| v1.4 | Access.key/1 |
Access.key/2 (v1.3) |
| v1.4 |
Behaviour модуль |
@callback атрибут модуля (v1.0) |
| v1.4 | Enum.uniq/2 |
Enum.uniq_by/2 (v1.2) |
| v1.4 | Float.to_char_list/2 |
:erlang.float_to_list/2 (Erlang/OTP 17) |
| v1.4 | Float.to_string/2 |
:erlang.float_to_binary/2 (Erlang/OTP 17) |
| v1.4 |
HashDict модуль |
Map (v1.2) |
| v1.4 |
HashSet модуль |
MapSet (v1.1) |
| v1.4 | IEx.Helpers.import_file/2 |
IEx.Helpers.import_file_if_available/1 (v1.3) |
| v1.4 | Mix.Utils.camelize/1 |
Macro.camelize/1 (v1.2) |
| v1.4 | Mix.Utils.underscore/1 |
Macro.underscore/1 (v1.2) |
| v1.4 | Многобуквенные псевдонимы в OptionParser
|
Используйте однобуквенные псевдонимы (v1.0) |
| v1.4 |
Set модуль |
MapSet (v1.1) |
| v1.4 | Stream.uniq/2 |
Stream.uniq_by/2 (v1.2) |
| v1.3 |
\x{X*} внутри строк/сигилов/списков символов |
\uXXXX или \u{X*} (v1.1) |
| v1.3 |
Dict модуль |
Keyword (v1.0) или Map (v1.2) |
| v1.3 |
:append_first опция в Kernel.defdelegate/2
|
Определите функцию явно (v1.0) |
| v1.3 | Map/dictionary как второй аргумент в Enum.group_by/3
|
Enum.reduce/3 (v1.0) |
| v1.3 | Keyword.size/1 |
Kernel.length/1 (v1.0) |
| v1.3 | Map.size/1 |
Kernel.map_size/1 (v1.0) |
| v1.3 |
/r опция в Regex
|
/U (v1.1) |
| v1.3 |
Set поведение |
MapSet структура данных (v1.1) |
| v1.3 | String.valid_character?/1 |
String.valid?/1 (v1.0) |
| v1.3 | Task.find/2 |
Используйте прямое сопоставление сообщений (v1.0) |
| v1.3 | Не-map как второй аргумент в URI.decode_query/2
|
Используйте map (v1.0) |
| v1.2 |
Dict поведение |
MapSet структура данных (v1.1) |
| v1.1 | ?\xHEX |
0xHEX (v1.0) |
| v1.1 |
Access протокол |
Access поведение (v1.1) |
| v1.1 |
as: true | false в alias/2 и require/2
|
Нет |
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.13.4/compatibility-and-deprecations.html