在 Elixir 中,为什么导入模块时首选“alias”而不是“import”?

问题描述 投票:0回答:2

请注意,该语言通常不鼓励导入。在处理您自己的代码时,更喜欢导入别名。

我在文档中找到了此声明,但那里没有进一步的解释。

erlang elixir
2个回答
11
投票

几个原因:

  • import
    在这些模块之间创建编译时依赖关系,这意味着导入模块编译需要等待导入模块编译完成。
    alias
    不要创建这样的依赖关系。
  • import
    通常会在模块范围内引入太多内容,并且当导入的模块将添加更多函数时可能会导致编译冲突(您不能定义与导入的函数同名的函数)。

0
投票

我只是想知道同样的事情并做了一些研究。

  • 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()

希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.