erlang - Erlang 中的 compile(export_all) 和 export([all/0]) 有什么区别?
问题描述
似乎两者在使用时具有相同的效果,因为在编译代码时会导出所有函数。两者有区别吗?是否export([all/0]).
导出所有功能而无需编译?
解决方案
我多次阅读 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()
。
推荐阅读
- workflow - 源限定符允许值超过 Informatica 中定义的大小
- c# - 可以在类型级别而不是单个 C# 属性设置器中添加验证吗?
- transliteration - 谷歌输入工具是否可用于网站输入翻译?
- spring - 春季数据 Redis。JPA Repository findBy 有时无法获取现有记录
- rust - 如何创建一个返回泛型类型的修改实例的泛型函数?
- node.js - 从 google doc api 返回时,为什么方程对象在 json 中为空?
- python - python3 ConnectionRefusedError: [Errno 61] 执行线程 http.server 时连接被拒绝
- sql - 如何在sql中按行和colmun获取最大值
- javascript - 是否有更有效的方法来禁用选择的多个选项?
- javascript - 向后台脚本发送两条消息并等待一条消息完成,然后再执行另一条消息