Источник Совместимость и устаревшие функции
Elixir имеет версионирование по схеме vMAJOR.MINOR.PATCH.
В настоящее время Elixir находится на версии 1. Новая обратная совместимая версия выпускается каждые 6 месяцев. Выпуски с исправлениями ошибок и пакетами безопасности не запланированы и производятся по мере необходимости.
Elixir применяет исправления ошибок только для последней ветки с исправлением ошибок. Исправления пакетов безопасности доступны для последних 5 ветвей с исправлением ошибок:
| Версия Elixir | Поддержка |
|---|---|
| 1.18 | Исправления ошибок и пакеты безопасности |
| 1.17 | Только пакеты безопасности |
| 1.16 | Только пакеты безопасности |
| 1.15 | Только пакеты безопасности |
| 1.14 | Только пакеты безопасности |
О новых выпусках объявляется на читаемом только для чтения списке рассылки новостей. Все релизы с исправлениями безопасности будут помечены [security].
В настоящее время нет планов выпуска основной версии v2.
Между версиями Elixir без изменения основной версии
Выпуски Elixir с исправлением ошибок и пакетами безопасности обратно совместимы: поведение и документированные 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 без ошибок, если таковые необходимы. Только последующий выпуск с исправлением ошибок, в данном случае v1.5.0, эффективно использует новые возможности, предоставляемые последним выпуском Erlang/OTP.
Устаревшие функции
Политика
Устаревание функций в Elixir происходит в 3 этапа:
Функция мягко устаревает. Это означает, что как в CHANGELOG, так и в документации функция должна быть указана как устаревшая, но при выполнении кода предупреждение не выводится. Нет требования к мягкому устареванию функции.
Функция эффективно устаревает, вызывая предупреждения при использовании. Это также известно как жёсткое устаревание. Для того, чтобы функция устарела, предложенная альтернатива ДОЛЖНА существовать в течение МИНИМУМ трёх версий с исправлением ошибок. Например,
Enum.uniq/2была мягко устаревшей в пользуEnum.uniq_by/2в Elixir v1.1. Это означает, что предупреждение об устаревании может быть выведено только Elixir v1.4 или более поздней версии.Функция удаляется. Это может произойти только в крупных выпусках. Это означает, что устаревшие функции в Elixir v1.x будут удалены только в Elixir v2.x.
Таблица устаревших функций
Первый столбец — версия, в которой функция была жёстко устаревшей. Второй столбец кратко описывает устаревшую функцию, а третий столбец объясняет замену и с какой версии доступна замена.
| Версия | Устаревшая функция | Заменено на (доступно с) |
|---|---|---|
| v1.18 |
<%# in EEx |
<%!-- (v1.14) or <% # (v1.0) |
| v1.18 |
handle_text/2 callback in EEx |
handle_text/3 (v1.14) |
| v1.18 | Returning 2-arity fun from Enumerable.slice/1
|
Returning 3-arity (v1.14) |
| v1.18 | Ranges with negative steps in Range.new/2
|
Explicit steps in ranges (v1.11) |
| v1.18 | Tuple.append/2 |
Tuple.insert_at/3 (v1.0) |
| v1.18 | mix cmd --app APP |
mix do --app APP (v1.14) |
| v1.18 | List.zip/1 |
Enum.zip/1 (v1.0) |
| v1.18 | Module.eval_quoted/3 |
Code.eval_quoted/3 (v1.0) |
| v1.17 | Single-quoted charlists ('foo') |
~c"foo" (v1.0) |
| v1.17 |
left..right in patterns and guards |
left..right//step (v1.11) |
| v1.17 | ExUnit.Case.register_test/4 |
register_test/6 (v1.10) |
| v1.17 |
:all in IO.read/2 and IO.binread/2
|
:eof (v1.13) |
| v1.16 | ~R/.../ |
~r/.../ (v1.0) |
| v1.16 | Ranges with negative steps in Enum.slice/2
|
Explicit steps in ranges (v1.11) |
| v1.16 | Ranges with negative steps in String.slice/2
|
Explicit steps in ranges (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 and similar in module body |
Application.compile_env/3 (v1.10) |
| v1.14 | Compiled patterns in String.starts_with?/2
|
Pass a list of strings instead (v1.0) |
| v1.14 | Mix.Tasks.Xref.calls/1 |
Compilation tracers (outlined in Code) (v1.10) |
| v1.14 |
$levelpad in Logger |
None |
| v1.14 |
<|> as a custom operator |
Another custom operator (v1.0) |
| v1.13 |
! and != in Version requirements |
~> or >= (v1.0) |
| v1.13 | Mix.Config |
Config (v1.9) |
| v1.13 |
:strip_beam config to 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() to read module attributes |
Remove the parenthesis (v1.0) |
| v1.12 | use EEx.Engine |
Explicitly delegate to EEx.Engine instead (v1.0) |
| v1.12 |
:xref compiler in Mix |
Nothing (it always runs as part of the compiler now) |
| 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 comprehension (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.18.1/compatibility-and-deprecations.html