Источник Совместимость и устаревшие функции
Elixir имеет версионирование по схеме vMAJOR.MINOR.PATCH.
В настоящее время Elixir находится на основной версии v1. Каждый 6 месяцев происходит выпуск новой совместимой с предыдущими версиями версии MINOR. Выпуски PATCH не запланированы и происходят при необходимости исправления ошибок или внесения исправлений безопасности.
Elixir исправляет ошибки только для последней версии MINOR. Исправления безопасности доступны для последних 5 MINOR версий:
| Версия Elixir | Поддержка |
|---|---|
| 1.17 | Исправления ошибок и исправления безопасности |
| 1.16 | Только исправления безопасности |
| 1.15 | Только исправления безопасности |
| 1.14 | Только исправления безопасности |
| 1.13 | Только исправления безопасности |
О новых выпусках объявляется в списке рассылки объявлений с только для чтения доступом. Все выпуски с исправлениями безопасности будут помечены с помощью [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 в выпусках 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 или более поздних версиях.Функция удаляется. Это может произойти только в основных выпусках. Это означает, что устаревшие функции в Elixir v1.x будут удалены только в Elixir v2.x.
Таблица устаревших функций
Первый столбец — версия, в которой функция была признана жестко устаревшей. Второй столбец кратко описывает устаревшую функцию, а третий столбец объясняет замену и с какой версии доступна замена.
| Версия | Устаревшая функция | Заменена на (доступно с версии) |
|---|
| v1.17 | Список символов в одинарных кавычках ('foo') |
~c"foo" (v1.0) |
| v1.17 |
left..right в шаблонах и охранных условиях |
left..right//step (v1.11) |
| v1.17 | ExUnit.Case.register_test/4 |
register_test/6 (v1.10) |
| v1.17 |
:all в IO.read/2 и IO.binread/2
|
:eof (v1.13) |
| v1.16 | ~R/.../ |
~r/.../ (v1.0) |
| v1.16 | Диапазоны с отрицательными шагами в Enum.slice/2
|
Явные шаги в диапазонах (v1.11) |
| v1.16 | Диапазоны с отрицательными шагами в String.slice/2
|
Явные шаги в диапазонах (v1.11) |
| 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 | Передача не-chardata в 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 | Карта/словарь в качестве второго аргумента в 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-2024 The Elixir Team
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.17.2/compatibility-and-deprecations.html