2013-05-28 75 views

回答

2

不,没有简单的方法来解决这个问题。必须更新源代码,并且每个引用导入的函数都以前述的模块为前缀。例如,每次调用format都应该用io_lib:format替换,但您必须知道从哪个模块导入了哪个函数。

您可以先删除-import指令。然后编译失败,抱怨未定义的函数。那就是你需要提供正确模块名称的地方。查看io_lib,erl_scanerl_parse的文档页面,了解哪些功能在哪个模块中。

+0

删除所有从全部导入这些文件似乎没有其他修改(这是正常的?) – LtWorf

+0

我猜有人清理了代码,并已经把所有的电话前缀,但忘记取出进口指令。 – legoscia

+0

请注意,那些导入声明(已删除的实验“软件包”的一部分)未导入特定函数,如常规导入(ModuleName,[Function1,...,FunctionN]),但模块名称,以便可以使用“foo”来代替“bar.baz.foo”等。导入一个像io_lib这样的名称意味着您不必像使用.io_lib那样使用前导点来表示“空白”名称空间。如果包含模块本身不在包装中(可能是一次,然后再重新命名),那么进口没有任何影响。 – RichardC

-3

首先看看存储在位置$ERL_LIBS中的内容,通常指向/ usr/lib/erlang/lib。

+0

编译工作正常,直到dist-upgrade发生,模块出现在系统上 – LtWorf

+0

据我所知,这就是为什么我试图查看升级过程中模块是否已被删除或重命名 – chollida

9

那么,-import().正在工作,但它确实不是做你期待它做的事情。它不会NOT将模块“导入”到模块中,也不会出现,找到模块并获取所有导出的函数,并允许您在不使用模块名称的情况下使用它们。您可以使用-import这样的:

-import(lists, [map/2,foldl/3,foldr/3]). 

然后你就可以调用明确导入功能,而模块名称和编译器通过添加模块名语法转换呼叫。因此,编译器将改变:

map(MyFun, List) ===> lists:map(MyFun, List) 

注意,这是ALL它。没有检查模块是否存在,或者是否导出函数,这是一种纯粹的朴素语法转换。它给你的只是稍微短一些的代码。出于这个原因,很少有人使用大多数人建议不要使用它。

还要注意,所有操作的代码单元都是模块,因此编译器根本不会执行任何模块间检查或优化。一切之间的模块就像检查模块的存在或其导出的功能是在运行时完成,当你调用另一个模块的功能。

+0

是的,我了解它的功能。我没有写代码,我只是想让它工作,如果删除导入它的工作,显然名称转换没有使用无论如何,我想 – LtWorf

+0

,无论如何,如果螺纹钢失败我会说,导入不工作。 – LtWorf

+0

@LWWorf它取决于你不工作的意思。你给出的例子是**非法语法**,这是编译器所抱怨的。所以它从来没有像实际尝试做一些导入。在这种情况下,Rebar没有做任何特殊的事情,它使用了普通的erlang解析器和编译器,所以失败了,因为非法语法导致解析器和编译器失败。 – rvirding

2

你的问题是你正在使用参数化模块的一部分的实验-import(Mod)指令。这些在R16B以后不复存在。

我经常建议不要使用导入。它伤害了外国电话的快速搜索和独特命名。获得一个可以快速扩展名称的编辑器。

+1

谢谢,我避免了参数化模块:-)所以我错过了'-import(Mod).'构造。 – rvirding