时间:2019-05-23 21:08:23

标签: erlang

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

2 个答案:

答案 0 :(得分:6)

我多次阅读了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()时没有错误。

答案 1 :(得分:2)

仅在模块外部可见导出的功能。例如,如果您从模块foo/0中导出函数bar。编译完成后,您就可以调用bar:foo()
当您想为特定的erlang模块定义一些编译器选项时,使用compile属性。该属性接受一个参数,即编译器选项。这里的export_all是编译器选项,它告诉编译器从该文件导出所有功能。您也可以定义其他编译器选项。要查看所有选项的列表,请参见compile module手册。

export属性用于告知编译器我们要从此模块导出的功能。它接受一个列表,该列表的每个项目都应为FunctionName/Arity。定义-export([all/0]).时,您告诉编译器我想从模块中导出函数all/0。就这样
请注意,如果在一个模块中同时使用-export([...]).-compile(export_all).,则将导出所有功能。