查看源码 特性

在 OTP 25 中引入,Erlang 具有可选择特性的概念。特性可以更改、添加或删除语言和/或运行时系统的行为。例如可以包括:

  • 向语言添加新的语法结构
  • 更改现有结构的语义
  • 更改某些运行时方面的行为

一个特性最初会以 OTP 的实验性部分的状态开始,让用户可以试用并提供反馈。通过编译器的选项、模块中的指令和运行时系统的选项可以启用试用特性。即使一个特性不是实验性的,仍然可以启用或禁用它。这使得可以在合适的速度下调整代码库,而不是在更改到新版本时被强制调整。

特性的状态最终会变成 OTP 的永久组成部分或被拒绝,被删除且不再可选。

特性的生命周期

一个特性处于四种可能的状态之一:

  • 实验性 - 初始状态,旨在试用和收集反馈。该特性可以启用,但默认情况下禁用。

  • 已批准 - 该特性已最终确定,现在是 OTP 的一部分。默认情况下启用,但可以禁用。

  • 永久 - 该特性现在是 OTP 的永久组成部分。它不再可以禁用。

  • 已拒绝 - 该特性从未达到已批准状态,将不会成为 OTP 的一部分。它无法启用。

离开实验性状态后,一个特性可以进入其他三种状态中的任何一种,如果下一个状态是已批准,则该特性最终将进入永久状态。一个特性只能在发布时更改状态。

一个特性可能会在多个版本中处于已批准状态。

状态默认可配置可用
实验性禁用
已批准启用
永久启用
已拒绝禁用

表格:特性状态

  • 可配置是指可以通过编译器选项和被编译的文件中的指令启用或禁用该特性。
  • 可以使用 FEATURE_AVAILABLE 宏查看是否可用。

启用和禁用特性

要使用处于实验性状态的特性,必须在编译期间启用它。这可以通过多种不同的方式完成:

更改

在 Erlang/OTP 25 中,为了加载启用了特性的模块,还需要在运行时启用该特性。这是通过使用 erl 的选项 -enable-feature 完成的。此要求已在 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 中获得批准。