我刚刚开始学习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背景,这种行为对我来说很奇怪。请任何人帮助我或指出一些好的资源来阅读。
答案 0 :(得分:3)
import
并没有像许多其他语言那样导入任何东西。它所做的只是使当前命名空间可以访问导入模块的导出函数。引用the docs
每当我们想要在不使用完全限定名称的情况下轻松访问其他模块的函数或宏时,我们就会使用
import
。
如果您希望A.func
和B.func
指向相同的功能,您可以选择几个选项。第一个很简单 - 制作包装函数:
defmodule B do
def func do
A.func
end
end
如果您想要更复杂的继承类型内容,可以考虑使用__using__
和defoverridable
创建super
宏