我在模块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),所以我没有看到缺少命名空间是错误的来源。
那么,究竟是什么导致了上述错误,我该如何解决?
答案 0 :(得分:7)
在Erlang中,"导入"来自另一个模块的函数意味着能够将其称为本地函数,而不是模块前缀。所以使用这个指令:
-import(square, [area/1, perim/1]).
你可以写area(42)
,它的意思与square:area(42)
相同。
但是,如果您在两个模块中加入area
和perim
个函数,那么在编写area(42)
时您实际调用的函数将是不明确的。
正如您正确注意到的那样,您始终可以使用模块的名称限定函数调用,即square:area(42)
和circle:area(42)
- 所以我建议一致地删除两者 import指令。 Erlang Programming Rules的规则6.6也建议这样做 - "不要使用导入"。