檢視原始碼 相容性和棄用
Elixir 版本依據 vMAJOR.MINOR.PATCH 架構。
Elixir 目前為主要版本 v1。每 6 個月會推出一個向後相容的小版本。修補版本沒有排程,會在有錯誤修正或安全性修補時推出。
Elixir 僅對最新小版本套用錯誤修正。安全性修補適用於最後 5 個小版本
Elixir 版本 | 支援 |
---|---|
1.16 | 錯誤修正和安全性修補 |
1.15 | 僅安全性修補 |
1.14 | 僅安全性修補 |
1.13 | 僅安全性修補 |
1.12 | 僅安全性修補 |
新版本會在唯讀的 公告郵件清單 中公告。所有安全性版本 都會標記為 [security]
。
目前沒有主要 v2 版本的計畫。
非主要 Elixir 版本之間
Elixir 小版本和修補版本向後相容:在特定版本中定義良好的行為和文件化 API 會持續在未來版本中運作。
雖然我們預期絕大多數程式會持續相容,但無法保證未來變更不會中斷任何程式。在一些不太可能的情況下,我們可能會引入中斷現有程式碼的變更
安全性:實作中可能會出現安全性問題,而解決方案需要向後不相容的變更。我們保留處理此類安全性問題的權利。
錯誤:如果 API 有不想要的行為,依賴錯誤行為的程式可能會在錯誤修正後中斷。我們保留修正此類錯誤的權利。
編譯器前端:可能會對編譯器進行改善,為模稜兩可的模式引入新的警告,並提供更詳細的錯誤訊息。這些可能會導致編譯錯誤(在使用
--warning-as-errors
執行時),或在特定錯誤訊息上斷言時導致工具失敗(雖然應該避免這樣做)。我們保留進行此類改善的權利。匯入:可能會將新的函式新增至
Kernel
模組,此模組會自動匯入。它們可能會與模組中定義的區域函式發生衝突。衝突可以使用import Kernel, except: [...]
以向後相容的方式解決,其中清單列出所有不想從Kernel
匯入的函式。我們保留進行此類新增的權利。
為了持續進化語言而不引入破壞性變更,Elixir 將依賴於棄用來降級某些實務並推廣新的實務。我們的棄用政策在 「棄用」區塊 中概述。
上述相容性保證的唯一例外是實驗性功能,這些功能會明確標示為實驗性功能,且在穩定之前不提供任何相容性保證。
Elixir 和 Erlang/OTP 之間
Erlang/OTP 版本控管獨立於 Elixir 的版本控管。Erlang 每年發布一個新的主要版本。我們的目標是在 Elixir 發布時支援最後三個 Erlang 主要版本。相容性表格如下所示。
Elixir 版本 | 支援的 Erlang/OTP 版本 |
---|---|
1.16 | 24 - 26 |
1.15 | 24 - 26 |
1.14 | 23 - 25(以及 v1.14.5 起的 Erlang/OTP 26) |
1.13 | 22 - 24(以及 v1.13.4 起的 Erlang/OTP 25) |
1.12 | 22 - 24 |
1.11 | 21 - 23(以及 v1.11.4 起的 Erlang/OTP 24) |
1.10 | 21 - 22(以及 v1.10.3 起的 Erlang/OTP 23) |
1.9 | 20 - 22 |
1.8 | 20 - 22 |
1.7 | 19 - 22 |
1.6 | 19 - 20(以及 v1.6.6 起的 Erlang/OTP 21) |
1.5 | 18 - 20 |
1.4 | 18 - 19(以及 v1.4.5 起的 Erlang/OTP 20) |
1.3 | 18 - 19 |
1.2 | 18 - 18(以及 v1.2.6 起的 Erlang/OTP 19) |
1.1 | 17 - 18 |
1.0 | 17 - 17(以及 v1.0.5 起的 Erlang/OTP 18) |
Elixir 可以在修補程式版本中新增與新 Erlang/OTP 版本的相容性,例如在 v1.4.5 中支援 Erlang/OTP 20。這些版本是為了方便而製作,且通常包含 Elixir 在沒有錯誤的情況下執行的最小變更(如果需要變更的話)。只有下一個次要版本(在本例中為 v1.5.0)才能有效利用最新 Erlang/OTP 版本提供的全新功能。
棄用
政策
Elixir 棄用分為 3 個步驟
功能已軟棄用。這表示 CHANGELOG 和文件都必須將該功能列為已棄用,但執行程式碼時不會實際發出警告。沒有軟棄用功能的要求。
透過在使用時發出警告,該功能已實際棄用。這也稱為硬棄用。為了棄用某個功能,建議的替代方案必須存在於至少三個次要版本中。例如,
Enum.uniq/2
在 Elixir v1.1 中已軟棄用,並建議使用Enum.uniq_by/2
。這表示只有 Elixir v1.4 或更新版本才會發出棄用警告。該功能已移除。這只能在主要版本中發生。這表示 Elixir v1.x 中的已棄用功能只能由 Elixir v2.x 移除。
棄用表格
第一欄是該功能已硬棄用的版本。第二欄簡短描述已棄用的功能,第三欄說明替換方案,以及替換方案可用的版本。
版本 | 已棄用功能 | 已取代(自版本) |
---|---|---|
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 | 使用 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 | 使用 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__ in 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) or 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 in Logger 應用程式環境 | :compile_time_purge_matching in Logger 應用程式環境 (v1.7) |
v1.10 | Supervisor.Spec.supervise/2 | 在 Supervisor 中概述的新子規格 (v1.5) |
v1.10 | :simple_one_for_one strategy in Supervisor | DynamicSupervisor (v1.6) |
v1.10 | :restart 和 :shutdown in Task.Supervisor.start_link/1 | :restart 和 :shutdown in Task.Supervisor.start_child/3 (v1.6) |
v1.9 | 可列舉的 key in 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 in 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 | 從 Mix.Compilers.Erlang.compile/6 的回呼傳回 {:ok, contents} 或 :error | 傳回 {: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 | 在 GenServer 回呼中呼叫 super/1 | 明確實作行為而不呼叫 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 中,第二個參數是 Map/字典 | 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 中將非映射作為第 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 | 無 |