如果我正在编写一个传递另一个函数的函数,有没有办法检查我传递的函数的arity,或者模式匹配不同的arities?我可以使用is_function / 2来检查特定的arities,但这将是获取数字的一种尴尬方式。
答案 0 :(得分:23)
您可以使用:erlang.fun_info/1
;它返回一堆关于给定函数的信息,包括它的arity:
iex> :erlang.fun_info(fn -> :ok end)[:arity]
0
iex> :erlang.fun_info(fn(_, _, _) -> :ok end)[:arity]
3
正如我链接的文档所说,此函数主要用于调试目的,但它可用于确定函数的arity。
答案 1 :(得分:3)
:erlang.fun_info/1
如果您引用了该函数,则很适合查找Arity。
如果您想弄清楚某个函数具有哪些Arities,但没有对其进行引用(因为Arity是函数标识的一部分),则有两种方法。
如果您想知道它是否支持特定的Arity,:erlang.function_exported/3
将使用模块,函数名称(sans-arity)和arity:
:erlang.function_exported(IO, :puts, 7) #=> false
:erlang.function_exported(IO, :puts, 2) #=> true
如果您想知道函数支持的所有Arities,可以使用模块的__info__
元数据函数:
:functions |> IO.__info__ |> Keyword.get_values(:puts) #=> [1,2]