有没有办法在Elixir中检查函数的arity?

时间:2015-12-15 13:27:33

标签: elixir

如果我正在编写一个传递另一个函数的函数,有没有办法检查我传递的函数的arity,或者模式匹配不同的arities?我可以使用is_function / 2来检查特定的arities,但这将是获取数字的一种尴尬方式。

2 个答案:

答案 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]