如果一个模块import
是多个其他模块,那么给定函数的来源可能并不明显.例如:
defmodule Aimable do import Camera import Gun def trigger do shoot # which import brought it in? end end
我知道有办法最大限度地减少这种混乱:良好的命名,专注的模块,有针对性的导入等import Gun, only: [:shoot]
.
但是,如果我遇到这样的代码,有没有办法检查Aimable
并查看函数的来源shoot
?
你可以直接这样做:
# from inside the module; IO.inspect(&Aimable.shoot/0) reveals nothing IO.inspect &shoot/0 #=> &Gun.shoot/0
看一下这个
还要记住,在两个不同的模块中,不能将相同的函数名具有相同的arity,并将它们导入到另一个模块中.调用该函数时,这将导致歧义错误.
另一种痛苦的方式.你可以使用function_exported?/ 3..眼镜:
function_exported?(atom | tuple, atom, arity) :: boolean
如果模块已加载并且包含具有给定arity的公共函数,则返回true,否则返回false.
例子:
function_exported?(Gun, :shoot, 0) #=> true function_exported?(Camera, :shoot, 0) #=> false