【发布时间】:2018-08-16 01:00:08
【问题描述】:
如果我正在编写一个传递另一个函数的函数,有没有办法检查我传递的函数的元数,或者针对不同的元数进行模式匹配?我可以使用 is_function/2 来检查特定的 arities,但这是获取数字的一种尴尬方式。
【问题讨论】:
标签: elixir
如果我正在编写一个传递另一个函数的函数,有没有办法检查我传递的函数的元数,或者针对不同的元数进行模式匹配?我可以使用 is_function/2 来检查特定的 arities,但这是获取数字的一种尴尬方式。
【问题讨论】:
标签: elixir
您可以使用:erlang.fun_info/1;它返回一堆关于给定函数的信息,包括它的数量:
iex> :erlang.fun_info(fn -> :ok end)[:arity]
0
iex> :erlang.fun_info(fn(_, _, _) -> :ok end)[:arity]
3
正如我链接的文档所说,此函数主要用于调试目的,但它可用于确定函数的数量。
【讨论】:
:erlang.fun_info/1 如果您有对函数的引用,则可以很好地找到元数。
如果您想弄清楚函数有哪些 arity,但没有对它的引用(因为 arity 是函数标识的一部分),则有两种方法。
如果你想知道它是否支持特定的arity :erlang.function_exported/3 需要模块、函数名(sans-arity)和arity:
:erlang.function_exported(IO, :puts, 7) #=> false
:erlang.function_exported(IO, :puts, 2) #=> true
如果您想了解函数支持的所有参数,可以使用模块的 __info__ 元数据函数:
:functions |> IO.__info__ |> Keyword.get_values(:puts) #=> [1,2]
【讨论】: