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