有谁知道出了什么问题?
下面是一个例子……Erlang 定义了一个函数error/2
,称为 BIF 或B uilt I n F函数,可以这样调用:
-module(a).
-compile(export_all).
go(X, Y) ->
case X > 10 of
true -> error(bad_arg, [X, Y]);
false -> ok
end,
io:format("hello\n").
在外壳中:
4> c(a).
a.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,a}
5> a:go(1, 2).
hello
ok
6> a:go(11, 2).
** exception error: bad_arg
in function a:go/2
called as a:go(11,2)
7>
现在,看看如果你定义一个也在error/2
你的模块中命名的函数会发生什么:
-module(a).
-compile(export_all).
error(X, Y) ->
io:format("X = ~w, Y = ~w~n", [X,Y]).
go(X, Y) ->
case X > 10 of
true -> error(bad_arg, [X, Y]);
false -> ok
end,
io:format("hello\n").
在外壳中:
8> c(a).
a.erl:2: Warning: export_all flag enabled - all functions will be exported
a.erl:9: Warning: ambiguous call of overridden auto-imported BIF error/2
- use erlang:error/2 or "-compile({no_auto_import,[error/2]})." to resolve name clash
{ok,a}
警告告诉你,如果你真的想调用 erlang's error/2
,那么你应该在函数名之前加上定义函数的模块名,即erlang
模块:
case X > 10 of
true -> erlang:error(bad_arg, [X, Y]);
...或者,如果你想调用你的版本error/2
,然后输入模块指令:
-compile({no_auto_import,[error/2]}).
在模块顶部:
-module(a).
-compile(export_all).
-compile({no_auto_import,[error/2]}).
error(X, Y) ->
io:format("X = ~w, Y = ~w~n", [X,Y]).
go(X, Y) ->
case X > 10 of
true -> error(bad_arg, [X, Y]);
false -> ok
end,
io:format("hello\n").
11> c(a).
a.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,a}
请注意,代码中的问题只是 a warning
,当我按照最初编写的方式运行程序时,erlang 调用了error/2
我的模块中定义的版本——而不是erlang
模块中的版本。
奇怪的是:erlang 模块中没有error/3
定义。