首页 > 解决方案 > Erlang 中的 compile(export_all) 和 export([all/0]) 有什么区别?

问题描述

似乎两者在使用时具有相同的效果,因为在编译代码时会导出所有函数。两者有区别吗?是否export([all/0]).导出所有功能而无需编译?

标签: erlang

解决方案


我多次阅读 Pouriya 的答案,直到我第三次阅读它,我Pouriya才明白要说什么。

想要Pouriya说的是,export([all/0])它没有做你认为它做的事情。相反,它会导出一个名为 的函数all(),并且不会导出模块中的其他函数。这很容易测试:

-module(my).
-export([all/0]).

all() -> ok.
go() -> ok.

在外壳中:

~/erlang_programs$ erl
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V9.3  (abort with ^G)
1> c(my).
my.erl:5: Warning: function go/0 is unused
{ok,my}

马上你会得到一个警告:因为go()没有导出,这意味着你不能从模块外部调用它,并且因为模块调用内部没有函数go(),所以该函数go()是“未使用的”。换句话说,go()永远不会执行,所以编译器想知道你为什么首先定义go()

但是,假设您无法弄清楚该警告的含义(毕竟这只是一个警告):

2> my:all().
ok

3> my:go().
** exception error: undefined function my:go/0

好像两者的效果一样

没有:

-module(my).
-compile([export_all]).

all() -> ok.
go() -> ok.

在外壳中:

/erlang_programs$ erl
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V9.3  (abort with ^G)

1> c(my).
my.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,my}

2> 

go()没有关于“未使用”的警告。和:

2> my:all().
ok

3> my:go().
ok

4> 

调用时没有错误go()


推荐阅读