文章目录

Erlang 模块:-module() 与 -export()

发布于 2026-04-06 14:21:01 · 浏览 13 次 · 评论 0 条

Erlang 模块:-module() 与 -export()

Erlang 代码的组织核心在于模块。模块是函数的集合容器,而 -module()-export() 则是定义这个容器边界与接口的两把钥匙。前者确立身份,后者决定权限。


1. 定义模块身份:-module()

每个 Erlang 源文件必须且只能包含一个模块定义。这是代码编译的最基本前提。

  1. 创建 一个后缀为 .erl 的文本文件。例如:my_math.erl
  2. 打开 文件,在第一行 输入 模块声明指令。
    指令格式为:-module(模块名).

注意:模块名必须与文件名保持完全一致(不含后缀)。如果文件名为 my_math.erl,代码必须是 -module(my_math).。如果名称不匹配,编译器将报错。

代码示例:

-module(my_math).

此时,模块仅具备了名称,但尚未对外暴露任何功能。


2. 开启对外接口:-export()

模块内的函数默认是私有的,仅限模块内部调用。若希望函数能被其他模块或 Shell 调用,必须使用 -export() 指令将其公开。

  1. 确定 需要公开的函数名称。
  2. 统计 该函数的参数个数(Erlang 中称为“元数”,Arity)。
  3. 编写 导出列表,格式为:-export([函数名/元数, 函数名/元数, ...]).

关键规则:函数由“函数名”和“元数”共同决定。add/2(两个参数的 add)和 add/3(三个参数的 add)被视为两个完全不同的函数。

代码示例:

-module(my_math).

% 导出一个名为 add 的函数,它接受 2 个参数
-export([add/2]).

3. 区分公有与私有函数

合理规划函数的可见性是编写高质量 Erlang 代码的基础。

  1. 分析 函数的用途。
    • 如果是给外部调用的接口(API),放入 -export() 列表。
    • 如果是内部辅助逻辑(如计算中间过程、数据格式化),保留为私有。
  2. 编写 对应的函数代码。

以下表格展示了公有与私有函数的区别:

特性 公有函数 私有函数
声明方式 列入 -export([]) 列表 不列入导出列表
调用范围 任意模块均可调用 仅限定义它的模块内部调用
典型用途 对外接口、业务入口 辅助逻辑、内部工具函数

4. 实战演练:编写并调用模块

通过一个完整的流程,实现一个包含加法运算和内部校验的模块。

  1. 新建 文件 calculator.erl
  2. 输入 以下完整代码:
% 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]).
  1. 保存 文件。
  2. 打开 Erlang Shell(在终端 输入 erl)。
  3. 编译 模块,输入
    c(calculator).

    若返回 {ok, calculator} 则表示编译成功。

  4. 调用 公有函数,输入
    calculator:add(10, 20).

    终端将输出日志并返回计算结果 30

  5. 尝试 调用私有函数,输入
    calculator:log_result(5).

    系统将报错,提示“未导出的函数”。这验证了私有函数的隔离性。

评论 (0)

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

扫一扫,手机查看

扫描上方二维码,在手机上查看本文