请注意,该语言通常不鼓励导入。在处理您自己的代码时,更喜欢导入别名。
我在文档中找到了此声明,但那里没有进一步的解释。
几个原因:
import
在这些模块之间创建编译时依赖关系,这意味着导入模块编译需要等待导入模块编译完成。 alias
不要创建这样的依赖关系。import
通常会在模块范围内引入太多内容,并且当导入的模块将添加更多函数时可能会导致编译冲突(您不能定义与导入的函数同名的函数)。我只是想知道同样的事情并做了一些研究。
alias
保持命名空间独立,但提供了快捷方式。import
将函数带入当前命名空间。这种命名空间分离似乎使得
alias
成为大型 Elixir 项目中 import
的首选,因为它 (1) 降低了命名冲突的风险,(2) 使代码更加清晰,因为有更多关于定义函数的位置。
alias Server.Request, as: Request
Request.some_function() # Instead of Server.Request.some_function()
import Server.Request
some_function() # Instead of Server.Request.some_function()
在大型项目中遇到
import
时,可能很难确定函数的来源。
另一方面,在 alias
的情况下,所选择的别名有望给出其来源的强烈暗示。
此外,
import
更容易发生命名冲突,因为它将任何/所有选定的函数带入当前范围。您可以(轻松地)定义多个来自不同模块的 some_function()
方法,然后这些方法会发生冲突。使用 alias
时这种情况的可能性要小得多,因为这些函数是由命名空间分隔的。
alias Server.Request
alias Server.Response
Request.some_function()
Response.some_function()
希望这有帮助!