如何确定在elixir中导入特定函数的模块

时间:2015-09-18 09:44:57

标签: elixir

如果通过在某个中间模块上调用use来包含多个外部模块,是否有一种简单的方法可以确定实际定义了给定方法的模块?

E.g:

defmodule ModuleB do
  def method_b do
  end
end    

defmodule ModuleA do
  # imports ModuleB implicitly
  use SomeModuleImportingModuleB

  def method_a
    # how to determine this is ModuleB.method_b?
    method_b
  end
end

2 个答案:

答案 0 :(得分:3)

我找到了一个适合我的解决方案,通过使用&捕获函数然后检查它:

def method_a
  IO.inspect &method_b/0 
  # outputs &ModuleB.method_b
  method_b
end

答案 1 :(得分:2)

每个模块都定义了一个__info__函数,您可以使用它来查看该模块导出的函数:

IO.inspect ModuleB.__info__(:exports)
# => [method_b: 0, module_info: 0, module_info: 1, __info__: 1]

请注意,当使用use时,有问题的模块可能会将代码直接注入正在定义的模块中并动态创建函数 - 这可能会导致函数变为可用,而这些函数尚未在{{1}中定义}模块。