Elixir 代码运行在 BEAM 虚拟机 中。BEAM 是 Erlang 运行时系统的一部分。Elixir 受 Erlang 启发,并与它共享运行环境,因此能和 Erlang 库很好地互操作。这意味着 Elixir 开发者可以在自己的 Elixir 代码中使用 Erlang 库。事实上,对于 Erlang 库已经提供的功能,Elixir 社区并不鼓励再写 Elixir 库来实现。
因此,某些功能,比如数学运算或定时器函数,在 Elixir 中只能通过 Erlang 使用。
Elixir 与 Erlang 之间的这种紧密关系意味着,要想成为一名熟练的 Elixir 开发者,你也许值得花些时间学习 Erlang 的基本语法。
在我们的 Elixir 代码中可以直接使用 Erlang 的标准库,无需任何额外的步骤。
调用 Erlang 函数的方式和调用 Elixir 函数一样,只有一点小小的区别。Erlang 的模块名是snake_case原子。例如,要调用 math 模块中的 Erlang pi/0 函数,可以这样写:
:math.pi()
# => 3.141592653589793
最常用的 Erlang 模块提供了 Elixir 标准库所缺少的功能。它们包括:
timer 模块,提供 sleep/1、send_after/2 和 send_interval/2 等函数。rand 模块,提供 uniform/0、normal/0 和 seed/2 等函数。:io_lib.format/2,提供 C 风格的字符串格式化(使用控制序列)。math 模块,提供 sin/1、cos/1、log2/1、log10/1、pow/2 等数学函数,以及更多。queue 模块,提供队列这种数据结构。crypto 模块,提供加密函数。zip 模块,提供处理 zip 归档文件的函数。calendar 模块,提供处理日期和时间的函数,例如 iso_week_number/1。要把 Date、Time 或 NaiveDateTime 结构体传给某个 Erlang 函数,需要用相应模块中的 to_erl 函数把它转换成 Erlang 格式。想了解 Erlang 的标准库,可以查阅 STDLIB 参考手册。
Elixir 与 Erlang 库的互操作并不局限于 Erlang 的标准库。任何 Erlang 库都可以在 Elixir 代码中使用。