Erlang 模块:-module() 与 -export()
Erlang 代码的组织核心在于模块。模块是函数的集合容器,而 -module() 与 -export() 则是定义这个容器边界与接口的两把钥匙。前者确立身份,后者决定权限。
1. 定义模块身份:-module()
每个 Erlang 源文件必须且只能包含一个模块定义。这是代码编译的最基本前提。
- 创建 一个后缀为
.erl的文本文件。例如:my_math.erl。 - 打开 文件,在第一行 输入 模块声明指令。
指令格式为:-module(模块名).
注意:模块名必须与文件名保持完全一致(不含后缀)。如果文件名为 my_math.erl,代码必须是 -module(my_math).。如果名称不匹配,编译器将报错。
代码示例:
-module(my_math).
此时,模块仅具备了名称,但尚未对外暴露任何功能。
2. 开启对外接口:-export()
模块内的函数默认是私有的,仅限模块内部调用。若希望函数能被其他模块或 Shell 调用,必须使用 -export() 指令将其公开。
- 确定 需要公开的函数名称。
- 统计 该函数的参数个数(Erlang 中称为“元数”,Arity)。
- 编写 导出列表,格式为:
-export([函数名/元数, 函数名/元数, ...]).
关键规则:函数由“函数名”和“元数”共同决定。add/2(两个参数的 add)和 add/3(三个参数的 add)被视为两个完全不同的函数。
代码示例:
-module(my_math).
% 导出一个名为 add 的函数,它接受 2 个参数
-export([add/2]).
3. 区分公有与私有函数
合理规划函数的可见性是编写高质量 Erlang 代码的基础。
- 分析 函数的用途。
- 如果是给外部调用的接口(API),放入
-export()列表。 - 如果是内部辅助逻辑(如计算中间过程、数据格式化),保留为私有。
- 如果是给外部调用的接口(API),放入
- 编写 对应的函数代码。
以下表格展示了公有与私有函数的区别:
| 特性 | 公有函数 | 私有函数 |
|---|---|---|
| 声明方式 | 列入 -export([]) 列表 |
不列入导出列表 |
| 调用范围 | 任意模块均可调用 | 仅限定义它的模块内部调用 |
| 典型用途 | 对外接口、业务入口 | 辅助逻辑、内部工具函数 |
4. 实战演练:编写并调用模块
通过一个完整的流程,实现一个包含加法运算和内部校验的模块。
- 新建 文件
calculator.erl。 - 输入 以下完整代码:
% 1. 声明模块名,必须与文件名一致
-module(calculator).
% 2. 导出 add/2 函数,使其公开
-export([add/2]).
% 3. 定义公开函数:执行加法
add(A, B) ->
Result = A + B,
% 调用私有函数记录日志
log_result(Result),
Result.
% 4. 定义私有函数:仅内部使用,无需导出
log_result(Value) ->
io:format("Result is: ~p~n", [Value]).
- 保存 文件。
- 打开 Erlang Shell(在终端 输入
erl)。 - 编译 模块,输入:
c(calculator).若返回
{ok, calculator}则表示编译成功。 - 调用 公有函数,输入:
calculator:add(10, 20).终端将输出日志并返回计算结果
30。 - 尝试 调用私有函数,输入:
calculator:log_result(5).系统将报错,提示“未导出的函数”。这验证了私有函数的隔离性。

暂无评论,快来抢沙发吧!