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

Import 在elixir中直接调用导入的模块函数,import,elixir,Import,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 func

我刚刚开始学习长生不老药,我不知道导入如何在长生不老药中工作。 当我使用
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"
但我能够在导入模块的函数中调用导入模块的函数

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"

当我能够从
func2
调用
func
时,我无法理解为什么B.func不能工作。有没有什么理论是我遗漏的。从Ruby背景来看,这种行为在我看来很奇怪。任何人都可以帮助我,或者给我指出一些好的资源来阅读。

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

只要我们想轻松地从其他模块访问函数或宏而不使用完全限定名,我们就使用
import

如果希望
A.func
B.func
指向同一个函数,则有两个选项。第一个很简单-创建一个包装器函数:

defmodule B do
  def func do
     A.func
  end
end

如果您想要一些更复杂的继承类型的东西,您可以考虑使用创建宏,并且导入不会像许多其他语言那样真正导入任何东西。它所做的只是使导入模块的导出函数可以从当前名称空间访问。引用

只要我们想轻松地从其他模块访问函数或宏而不使用完全限定名,我们就使用
import

如果希望
A.func
B.func
指向同一个函数,则有两个选项。第一个很简单-创建一个包装器函数:

defmodule B do
  def func do
     A.func
  end
end

如果你想要一些更复杂的继承类型的东西,你可以考虑创建一个宏,并且

谢谢你的链接和详细的回答。另一种说法是导入是词法的,本文希望能澄清这一点:另外,避免“类似继承”的东西,只鼓励回调感谢您提供的链接和详细解答另一种说法是导入是词汇性的,本文希望能够澄清这一点:另外,避免“类似继承”的东西,只鼓励回调使用它。:)