如果一个模块import是多个其他模块,那么给定函数的来源可能并不明显.例如:
defmodule Aimable do
import Camera
import Gun
def trigger do
shoot # which import brought it in?
end
end
Run Code Online (Sandbox Code Playgroud)
我知道有办法最大限度地减少这种混乱:良好的命名,专注的模块,有针对性的导入等import Gun, only: [:shoot].
但是,如果我遇到这样的代码,有没有办法检查Aimable并查看函数的来源shoot?
你可以直接这样做:
# from inside the module; IO.inspect(&Aimable.shoot/0) reveals nothing
IO.inspect &shoot/0 #=> &Gun.shoot/0
Run Code Online (Sandbox Code Playgroud)
还要记住,在两个不同的模块中,不能将相同的函数名具有相同的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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
489 次 |
| 最近记录: |