直接在elixir中调用导入的模块函数

时间:2015-12-19 20:50:58

标签: import elixir

我刚刚开始学习Elixir,我无法弄清楚Elixir的导入工作原理。 当我使用import将模块导入另一个模块时,我无法使用导入它的模块调用导入的函数。

但是我可以在导入的模块中调用导入模块的功能。

defmodule A do
  def func do
   IO.puts("func called")
  end
end

defmodule B do
  import A
end

A.func # o/p: "func called"
B.func # (UndefinedFunctionError) undefined function: B.func/0

defmodule B do
  import A

  def func2 do
    func
  end
end

B.func2 # o/p "func called"

我无法弄清楚为什么当我从func拨打func2时,B.func无效。是否有某种我缺失的理论。来自Ruby背景,这种行为对我来说很奇怪。请任何人帮助我或指出一些好的资源来阅读。

1 个答案:

答案 0 :(得分:3)

import并没有像许多其他语言那样导入任何东西。它所做的只是使当前命名空间可以访问导入模块的导出函数。引用the docs

  

每当我们想要在不使用完全限定名称的情况下轻松访问其他模块的函数或宏时,我们就会使用import

如果您希望A.funcB.func指向相同的功能,您可以选择几个选项。第一个很简单 - 制作包装函数:

defmodule B do
  def func do
     A.func
  end
end

如果您想要更复杂的继承类型内容,可以考虑使用__using__defoverridable创建super