Совместимость и устаревшие функции
Elixir имеет версионирование по схеме vMAJOR.MINOR.PATCH.
В настоящее время Elixir находится на основной версии v1. Каждый 6 месяцев происходит выпуск новой совместимой с предыдущими версиями версии MINOR. Выпуски PATCH не запланированы и выполняются при исправлении ошибок или внесении исправлений безопасности.
Elixir исправляет ошибки только для последней ветки MINOR. Исправления безопасности доступны для последних 5 веток MINOR:
| Версия Elixir | Поддержка |
|---|---|
| 1.15 | Исправления ошибок и исправления безопасности |
| 1.14 | Только исправления безопасности |
| 1.13 | Только исправления безопасности |
| 1.12 | Только исправления безопасности |
| 1.11 | Только исправления безопасности |
О новых выпусках объявляется в списке рассылки объявлений с только для чтения. Все выпуски с исправлениями безопасности будут помечены как [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 |
|---|
Elixir может добавить совместимость с новыми версиями Erlang/OTP в выпусках с исправлениями, таких как поддержка 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.
Таблица устаревших функций
Первый столбец - версия, в которой функция была жестко устаревшей. Второй столбец кратко описывает устаревшую функцию, а третий столбец поясняет замену и с какой версии замена доступна.
END_OF_DOCUMENT_MARKER| Версия | Устаревшая функция | Заменена на (доступна с) |
|---|---|---|
| v1.15 | Calendar.ISO.day_of_week/3 |
Calendar.ISO.day_of_week/4 (v1.11) |
| v1.15 | Exception.exception?/1 |
Kernel.is_exception/1 (v1.11) |
| v1.15 | Regex.regex?/1 |
Kernel.is_struct/2 (Kernel.is_struct(term, Regex)) (v1.11) |
| v1.15 | Logger.warn/2 |
Logger.warning/2 (v1.11) |
| v1.14 | use Bitwise |
import Bitwise (v1.0) |
| v1.14 | ~~~/1 |
bnot/2 (v1.0) |
| v1.14 | Application.get_env/3 и аналогичные в теле модуля |
Application.compile_env/3 (v1.10) |
| v1.14 | Компилируемые шаблоны в String.starts_with?/2 |
Вместо этого передайте список строк (v1.0) |
| v1.14 | Mix.Tasks.Xref.calls/1 |
Трейсеры компиляции (описаны в Code) (v1.10) |
| v1.14 | $levelpad в Logger |
Нет |
| v1.14 | <|> в качестве пользовательского оператора |
Другой пользовательский оператор (v1.0) |
| 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 | Перечисляемые ключи в 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
|
++/2 или Keyword.merge/2 (v1.0) |
| v1.8 | Передача непустого списка в :into в for/1
|
++/2 или Keyword.merge/2 (v1.0) |
| v1.8 | Передача непустого списка в Enum.into/2
|
++/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/1 генераторы (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 | to_char_list/1 |
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 опция в defdelegate/2
|
Определите функцию явно (v1.0) |
| v1.3 | Map/dictionary как 2-й аргумент в Enum.group_by/3
|
Enum.reduce/3 (v1.0) |
| v1.3 | Keyword.size/1 |
length/1 (v1.0) |
| v1.3 | Map.size/1 |
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 | Не-карта в качестве второго аргумента в URI.decode_query/2
|
Используйте карту (v1.0) |
| v1.2 |
Dict поведение |
Map и Keyword (v1.0) |
| 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.15.4/compatibility-and-deprecations.html