13 功能
在 OTP 25 中引入,Erlang 具有可选择功能的概念。功能可以更改、添加或删除语言和/或运行时系统的行为。例如:
- 向语言添加新的语法结构
- 更改现有构造的语义
- 更改某些运行时方面的行为
功能最初将处于 OTP 实验部分的状态,使用户可以试用并提供反馈。通过编译器选项、模块中的指令和运行时系统选项来启用试用功能。即使功能不是实验性的,仍然可以启用或禁用它。这样,就可以根据合适的节奏调整代码库,而不是在切换到新版本时被迫更改。
功能最终会进入以下两种状态之一:成为 OTP 的永久部分或被拒绝,被移除且不再可选。
13.1 功能的生命周期
功能处于四种可能的狀態之一
- 实验性
- 初始状态,用于试用和收集反馈。功能可以启用,但默认情况下处于禁用状态。
- 已批准
- 功能已完成,现已成为 OTP 的一部分。默认情况下处于启用状态,但可以禁用。
- 永久
- 功能现已成为 OTP 的永久部分。它不再可以禁用。
- 拒绝
- 功能从未达到批准状态,也不会成为 OTP 的一部分。它无法启用。
离开实验性状态后,功能可以进入另外三种状态中的任何一种,如果下一个状态是已批准,功能最终将进入永久状态。功能只能在与版本相关的联机中更改状态。
功能可能在几个版本中处于已批准状态。
状态 | 默认 | 可配置 | 可用 |
实验性 | 禁用 | 是 | 是 |
已批准 | 启用 | 是 | 是 |
永久 | 启用 | 否 | 是 |
拒绝 | 禁用 | 否 | 否 |
- 可配置意味着可以通过编译器选项和被编译文件中的指令来启用或禁用功能。
- 可以使用 FEATURE_AVAILABLE 宏查看可用性。
13.2 启用和禁用功能
要使用处于实验性状态的功能,必须在编译期间启用它。这可以通过多种不同的方式完成
- erlc 的选项
- 选项 -enable-feature 和 -disable-feature 可用于启用或禁用单个功能。
- 编译器选项
- 编译器选项 {feature, <feature>, enable|disable} 可用作 erlc 的 +<term> 选项,也可以用作 compile 模块中函数的选项参数。
- feature 指令
- 在模块的前缀中,可以使用 -feature(<feature>, enable|disable) 指令。这是启用和禁用功能的首选方法。
在 Erlang/OTP 25 中,为了加载启用功能的模块,还需要在运行时启用该功能。这是通过使用 erl 的选项 -enable-feature 来完成的。此要求已在 Erlang/OTP 26 中删除。
13.3 预处理器添加
为了允许在代码库过渡和/或试用实验性功能期间进行条件编译,feature 预定义宏 ?FEATURE_AVAILABLE(Feature) 和 ?FEATURE_ENABLED(Feature) 可用。
13.4 有关现有功能的信息
模块 erl_features erl_features 导出了一些函数,这些函数可用于获取有关当前功能以及编译模块时使用的功能的信息。
还可以使用 erlc 选项 -list-features 和 -describe-feature <feature> 来获取有关现有功能的信息。
此外,还有编译器选项 warn_keywords 可用于查找代码库中可能与尚未启用的功能中的关键字冲突的原子。
13.5 现有功能
存在以下可配置功能