檢視原始碼 功能

Erlang 在 OTP 25 中引入了可選功能的概念。功能可以變更、新增或移除語言和/或執行時系統的行為。範例包括:

  • 在語言中新增新的語法結構
  • 變更現有結構的語意
  • 變更某些執行時層面的行為

功能一開始會是 OTP 的實驗性部分,讓使用者可以嘗試並提供回饋。嘗試功能的可能性是透過編譯器的選項、模組中的指令和執行時系統的選項來啟用。即使功能不是實驗性的,仍然可以啟用或停用它。這樣可以讓程式碼庫以適當的速度調整,而無需在變更到新版本時被迫調整。

功能狀態最終會成為 OTP 的永久部分,或是被拒絕、移除且不再可選。

功能生命週期

功能有四種可能的狀態之一:

  • 實驗性 - 初始狀態,用於嘗試和收集回饋。該功能可以啟用,但預設為停用。

  • 已核准 - 該功能已完成,現在是 OTP 的一部分。預設情況下啟用,但可以停用。

  • 永久 - 該功能現在是 OTP 的永久部分。它無法再停用。

  • 已拒絕 - 該功能從未達到核准狀態,因此不會成為 OTP 的一部分。它無法啟用。

在離開實驗性狀態後,功能可以進入其他三種狀態中的任何一種,如果下一個狀態是已核准,則功能最終將進入永久狀態。功能只能在版本發佈時變更狀態。

功能可能會在多個版本中處於已核准狀態。

狀態預設值可配置可用
實驗性停用
已核准啟用
永久啟用
已拒絕停用

表格:功能狀態

  • 可配置表示可以透過編譯器選項和正在編譯的檔案中的指令來啟用或停用該功能。
  • 可以使用 FEATURE_AVAILABLE 巨集來查看是否可用。

啟用和停用功能

若要使用處於實驗性狀態的功能,必須在編譯期間啟用它。這可以透過多種不同的方式完成:

變更

在 Erlang/OTP 25 中,為了載入啟用某個功能的模組,也必須在執行時啟用該功能。這是透過將選項 -enable-feature 傳遞給 erl 來完成的。此要求已在 Erlang/OTP 26 中移除。但是,如果想要在 shell 中直接使用功能,仍需要在執行時啟用它們。

預處理器新增

為了在程式碼庫轉換期間和/或嘗試實驗性功能時允許條件編譯,可以使用 功能 預定義巨集 ?FEATURE_AVAILABLE(Feature)?FEATURE_ENABLED(Feature)

關於現有功能的資訊

erl_features 模組 erl_features 匯出許多函數,可用於取得有關目前功能以及編譯模組時使用的功能的資訊。

也可以使用 erlc 選項 -list-features-describe-feature <feature> 來取得關於現有功能的資訊。

此外,還有編譯器選項 warn_keywords,可用於找出程式碼庫中可能與尚未啟用的功能中的關鍵字衝突的原子。

現有功能

存在以下可配置功能:

  • maybe_expr (已核准) - 實作 maybe 表達式,該表達式在 EEP 49 中提出。它已在 Erlang/OTP 27 中核准。