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

Roh*_*ari 1 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"
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚为什么 B.func 无法工作,而我可以funcfunc2. 我是否缺少某种理论?从 Ruby 背景来看,这种行为对我来说看起来很奇怪。请任何人帮助我或为我指出一些好的资源来阅读。

jis*_*one 5

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

import每当我们想要轻松地从其他模块访问函数或宏而不使用完全限定名称时,我们就会使用它。

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

defmodule B do
  def func do
     A.func
  end
end
Run Code Online (Sandbox Code Playgroud)

如果您想要一些更复杂的继承类型的东西,您可以考虑使用and创建一个__using__defoverridablesuper