Elixir 提供了与 Erlang 库的出色互操作性。事实上,Elixir 不鼓励简单地包装 Erlang 库,而是直接与 Erlang 代码交互。在本节中,我们将介绍一些 Elixir 中没有的最常见和最有用的 Erlang 功能。
Erlang 模块的命名约定与 Elixir 不同,并且以小写字母开头。在这两种情况下,模块名称都是原子,我们通过分派到模块名称来调用函数:
![](https://img-blog.csdnimg.cn/direct/cb27503482c24bb8880831449d8eb1ab.png)
随着您对 Elixir 的熟练程度不断提高,您可能希望更详细地探索 Erlang STDLIB 参考手册。
二进制模块
内置 Elixir String 模块处理 UTF-8 编码的二进制文件。当您处理不一定是 UTF-8 编码的二进制数据时,:binary 模块很有用。
![](https://img-blog.csdnimg.cn/direct/b7e9c23082af43a290c2d0030b3c498d.png)
以上示例显示了差异;String 模块返回 Unicode 码位,而 :binary 处理原始数据字节。
格式化文本输出
Elixir 不包含类似于 C 和其他语言中的 printf 的函数。幸运的是,可以使用 Erlang 标准库函数 :io.format/2 和 :io_lib.format/2。第一个格式化为终端输出,而第二个格式化为 iolist。格式说明符与 printf 不同,有关详细信息,请参阅 Erlang 文档。
![](https://img-blog.csdnimg.cn/direct/e7a7e7191766485fbefa11d7e261c596.png)
加密模块
:crypto 模块包含哈希函数、数字签名、加密等:
![](https://img-blog.csdnimg.cn/direct/e4a4fd3b14914ca6a9f59027c15e73fc.png)
:crypto 模块是 Erlang 附带的 :crypto 应用程序的一部分。这意味着您必须将 :crypto 应用程序列为项目配置中的附加应用程序。为此,请编辑 mix.exs 文件以包含:
![](https://img-blog.csdnimg.cn/direct/47263e50b2fe4c0daf8b2b078329aabd.png)
任何不属于 :kernel 或 :stdlib Erlang 应用程序的模块都必须在 mix.exs 中明确列出其应用程序。您可以在 Erlang 文档中找到任何 Erlang 模块的应用程序名称,位于侧边栏中 Erlang 徽标的正下方。
有向图模块
:digraph 和 :digraph_utils 模块包含用于处理由顶点和边构成的有向图的函数。构建图后,其中的算法将有助于找到两个顶点之间的最短路径,或图中的循环。
给定三个顶点,找到从第一个顶点到最后一个顶点的最短路径。
![](https://img-blog.csdnimg.cn/direct/ec170c25b55c4d7abcded3edd6390873.png)
请注意,:digraph 中的函数会就地改变图结构,这是可能的,因为它们是作为 ETS 表实现的,下面将进行解释。
Erlang 存储项
:ets 和 :dets 模块分别处理内存或磁盘中大型数据结构的存储。
ETS 允许您创建包含元组的表。默认情况下,ETS 表受到保护,这意味着只有所有者进程可以写入表,但任何其他进程都可以读取。ETS 具有一些功能,允许将表用作简单数据库、键值存储或缓存机制。
ets 模块中的函数将作为副作用修改表的状态。
![](https://img-blog.csdnimg.cn/direct/ed73fa4d9c1d4e52a1ad6eee98b7a8d8.png)
数学模块
:math 模块包含常见的数学运算,包括三角函数、指数函数和对数函数。
![](https://img-blog.csdnimg.cn/direct/b217d36811864b27abcfa6d15b2a1106.png)
队列模块
:queue 模块提供了一种高效实现(双端)FIFO(先进先出)队列的数据结构:
![](https://img-blog.csdnimg.cn/direct/9ef98a66545d450ca51780a78db63217.png)
随机模块
:rand 具有返回随机值和设置随机种子的函数。
![](https://img-blog.csdnimg.cn/direct/19eda91958394ed68ccf0be5f0b1fcbf.png)
zip 和 zlib 模块
:zip 模块允许您从磁盘或内存读取和写入 ZIP 文件,以及提取文件信息。
此代码计算 ZIP 文件中的文件数量:
![](https://img-blog.csdnimg.cn/direct/dd082732633b45ef9ab27b579a1fbc33.png)
:zlib 模块处理 zlib 格式的数据压缩,如 Unix 系统中的 gzip 命令行实用程序中所述。
![](https://img-blog.csdnimg.cn/direct/114d8a77d392427fa49bd4c6055fb5c7.png)
"\nMary had a little lamb,\nHis fleece was white as snow,\nAnd everywhere that Mary went,\nThe lamb was sure to go."
学习 Erlang
如果您想深入了解 Erlang,这里有一份在线资源列表,涵盖了 Erlang 的基础知识及其更高级的功能:
本《Erlang 语法:速成课程》简要介绍了 Erlang 的语法。每个代码片段都附有 Elixir 中的等效代码。这是一个机会,您不仅可以接触到 Erlang 的语法,还可以复习您学到的有关 Elixir 的知识。
Erlang 的官方网站有一个简短的教程。有一章带有图片,简要描述了 Erlang 的并发编程原语。
《学习 Erlang 大有裨益!》是一本介绍 Erlang 及其设计原则、标准库、最佳实践等内容的出色入门书。阅读完上述速成课程后,您就可以安全地跳过本书中主要涉及语法的前几章。当您读到《并发指南》一章时,真正的乐趣就从这里开始了。
我们的最后一步是查看调试时可能使用的现有 Elixir(和 Erlang)库。