Erlang中的compile(export_all)和export([all / 0])有什么区别?

Low*_*ong 0 erlang

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

7st*_*tud 6

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

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

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

all() -> ok.
go() -> ok.
Run Code Online (Sandbox Code Playgroud)

在外壳中:

~/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}
Run Code Online (Sandbox Code Playgroud)

立即收到警告:因为go()未导出,所以您不能从模块外部调用它,并且由于模块内部没有函数调用go(),因此该函数go()“未使用”。换句话说,go()它将永远不会执行,因此编译器想知道为什么首先要定义go()

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

2> my:all().
ok

3> my:go().
** exception error: undefined function my:go/0
Run Code Online (Sandbox Code Playgroud)

似乎两者具有相同的效果

不:

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

all() -> ok.
go() -> ok.
Run Code Online (Sandbox Code Playgroud)

在外壳中:

/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> 
Run Code Online (Sandbox Code Playgroud)

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

2> my:all().
ok

3> my:go().
ok

4> 
Run Code Online (Sandbox Code Playgroud)

致电时没有错误go()