- Elixir 教程
- Elixir - 主页
- Elixir - 概述
- Elixir - 环境
- Elixir - 基本语法
- Elixir - 数据类型
- Elixir - 变量
- Elixir - 操作员
- Elixir - 模式匹配
- Elixir - 决策
- Elixir - 弦乐
- Elixir - 角色列表
- Elixir - 列表和元组
- Elixir - 关键字列表
- Elixir - 地图
- Elixir - 模块
- Elixir - 别名
- Elixir - 功能
- Elixir - 递归
- Elixir - 循环
- Elixir - 可枚举
- Elixir - 流
- Elixir - 结构
- Elixir - 协议
- Elixir - 文件 I/O
- Elixir - 流程
- 长生不老药 - 印记
- Elixir - 领悟
- Elixir - 类型规格
- Elixir - Behave
- Elixir - 错误处理
- Elixir - 宏
- Elixir - 图书馆
- Elixir 有用资源
- Elixir - 快速指南
- Elixir - 有用的资源
- Elixir - 讨论
Elixir - 模块
在 Elixir 中,我们将多个功能分组为模块。我们在前面的章节中已经使用过不同的模块,例如 String 模块、Bitwise 模块、Tuple 模块等。
为了在 Elixir 中创建我们自己的模块,我们使用defmodule宏。我们使用def宏来定义该模块中的函数 -
defmodule Math do def sum(a, b) do a + b end end
在接下来的部分中,我们的示例将变得更长,并且在 shell 中将它们全部键入可能会很棘手。我们需要学习如何编译 Elixir 代码以及如何运行 Elixir 脚本。
汇编
将模块写入文件总是很方便,以便可以编译和重用它们。假设我们有一个名为 math.ex 的文件,其中包含以下内容 -
defmodule Math do def sum(a, b) do a + b end end
我们可以使用命令 - Elixirc编译文件:
$ elixirc math.ex
这将生成一个名为Elixir.Math.beam的文件,其中包含已定义模块的字节码。如果我们再次启动iex,我们的模块定义将可用(前提是 iex 在字节码文件所在的同一目录中启动)。例如,
IO.puts(Math.sum(1, 2))
上述程序将生成以下结果 -
3
脚本模式
除了 Elixir 文件扩展名.ex之外,Elixir 还支持.exs文件用于脚本编写。Elixir 以完全相同的方式处理这两个文件,唯一的区别在于目标。.ex文件用于编译,而 .exs 文件用于编写脚本。执行时,两个扩展都会编译并将其模块加载到内存中,尽管只有.ex文件以 .beam 文件的格式将其字节码写入磁盘。
例如,如果我们想在同一个文件中运行 Math.sum ,我们可以按以下方式使用 .exs -
数学表达式
defmodule Math do def sum(a, b) do a + b end end IO.puts(Math.sum(1, 2))
我们可以使用 Elixir 命令运行它 -
$ elixir math.exs
上述程序将生成以下结果 -
3
该文件将在内存中编译并执行,并打印“3”作为结果。不会创建字节码文件。
模块嵌套
Elixir 中可以嵌套模块。该语言的这一特性可以帮助我们以更好的方式组织代码。要创建嵌套模块,我们使用以下语法 -
defmodule Foo do #Foo module code here defmodule Bar do #Bar module code here end end
上面给出的示例将定义两个模块:Foo和Foo.Bar。第二个可以作为Foo内的Bar进行访问,只要它们位于相同的词法范围内。如果稍后将Bar模块移到 Foo 模块定义之外,则必须通过其全名 (Foo.Bar) 引用它,或者必须使用别名章节中讨论的别名指令设置别名。
注意- 在 Elixir 中,不需要定义 Foo 模块来定义 Foo.Bar 模块,因为该语言将所有模块名称翻译为Atomics。您可以定义任意嵌套的模块,而无需在链中定义任何模块。例如,您可以定义Foo.Bar.Baz而不定义Foo或Foo.Bar。