如果通过在某个中间模块上调用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
答案 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}中定义}模块。