似乎两者在使用时具有相同的效果,就像在编译代码时导出所有函数一样。两者之间有区别吗?是否export([all/0]).无需编译就导出所有功能?
我读了几次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()。
| 归档时间: |
|
| 查看次数: |
123 次 |
| 最近记录: |