在Erlang中编译(export_all)和导出([all/0])之间有什么区别?

在Erlang中编译(export_all)和导出([all/0])之间有什么区别?,erlang,Erlang,这两个函数在使用时的效果似乎与编译代码时导出的所有函数相同。这两者有区别吗?是否导出[全部/0]。无需编译即可导出所有函数?从模块外部即可看到导出的函数。例如,如果从模块栏导出函数foo/0。编译后,您将能够调用bar:foo。 当您想要为特定的erlang模块定义一些编译器选项时,可以使用compile属性。此属性接受一个参数,即编译器选项。这里export_all是一个编译器选项,它告诉编译器从该文件导出所有函数。您还可以定义其他编译器选项。要查看所有选项的列表,请参阅手册 export属性

这两个函数在使用时的效果似乎与编译代码时导出的所有函数相同。这两者有区别吗?是否导出[全部/0]。无需编译即可导出所有函数?

从模块外部即可看到导出的函数。例如,如果从模块栏导出函数foo/0。编译后,您将能够调用bar:foo。 当您想要为特定的erlang模块定义一些编译器选项时,可以使用compile属性。此属性接受一个参数,即编译器选项。这里export_all是一个编译器选项,它告诉编译器从该文件导出所有函数。您还可以定义其他编译器选项。要查看所有选项的列表,请参阅手册

export属性用于告诉编译器要从此模块导出哪些函数。它接受一个列表,该列表的每一项都应该是FunctionName/Arity。定义时-导出[all/0]。您告诉编译器我想从模块中导出函数all/0。就这样。
请注意,如果同时使用-export[…]。和-compileexport\u all。在一个模块中,所有函数都将导出。

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

export属性用于告诉编译器要从此模块导出哪些函数。它接受一个列表,该列表的每一项都应该是FunctionName/Arity。定义时-导出[all/0]。您告诉编译器我想从模块中导出函数all/0。就这样。
请注意,如果同时使用-export[…]。和-compileexport\u all。在一个模块中,所有函数都将导出。

我读了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}
/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没有导出,这意味着您不能从模块外部调用它,并且因为模块内部没有函数调用go,所以go函数未使用。换句话说,go永远不会执行,因此编译器想知道为什么您首先定义go

但是,假设您无法理解该警告的含义,毕竟它只是一个警告:

2> my:all().
ok

3> my:go().
** exception error: undefined function my:go/0
看起来这两个有相同的效果

没有:

在外壳中:

~/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}
/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时没有错误。

我读了几遍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}
/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没有导出,这意味着您不能从模块外部调用它,并且因为模块内部没有函数调用go,所以go函数未使用。换句话说,go永远不会执行,因此编译器想知道为什么您首先定义go

但是,假设您无法理解该警告的含义,毕竟它只是一个警告:

2> my:all().
ok

3> my:go().
** exception error: undefined function my:go/0
看起来这两个有相同的效果

没有:

在外壳中:

~/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}
/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时没有错误