函数'Func / Arity'已从'Module'导入

时间:2013-11-13 11:14:26

标签: erlang

我在模块sqaure和circle中定义了area / 1和perim / 1.

我想在另一个模块中导入和使用它们。这是我的导入声明:

-import(square, [area/1, perim/1]).
-import(circle, [area/1, perim/1]).

我收到了这些错误消息。

~/test.erl:4: function area/1 already imported from square
~/test.erl:4: function perim/1 already imported from square

我知道erlang不支持命名空间。但是因为我们可以通过指定模块来限定函数调用(即square:area vs circle:area),所以我没有看到缺少命名空间是错误的来源。

那么,究竟是什么导致了上述错误,我该如何解决?

1 个答案:

答案 0 :(得分:7)

在Erlang中,"导入"来自另一个模块的函数意味着能够将其称为本地函数,而不是模块前缀。所以使用这个指令:

-import(square, [area/1, perim/1]).

你可以写area(42),它的意思与square:area(42)相同。

但是,如果您在两个模块中加入areaperim个函数,那么在编写area(42)时您实际调用的函数将是不明确的。

正如您正确注意到的那样,您始终可以使用模块的名称限定函数调用,即square:area(42)circle:area(42) - 所以我建议一致地删除两者 import指令。 Erlang Programming Rules的规则6.6也建议这样做 - "不要使用导入"。