【问题标题】:Is there a way to check a function's arity in Elixir?有没有办法在 Elixir 中检查函数的数量?
【发布时间】:2018-08-16 01:00:08
【问题描述】:

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

【问题讨论】:

    标签: elixir


    【解决方案1】:

    您可以使用:erlang.fun_info/1;它返回一堆关于给定函数的信息,包括它的数量:

    iex> :erlang.fun_info(fn -> :ok end)[:arity]
    0
    iex> :erlang.fun_info(fn(_, _, _) -> :ok end)[:arity]
    3
    

    正如我链接的文档所说,此函数主要用于调试目的,但它可用于确定函数的数量。

    【讨论】:

      【解决方案2】:

      :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]

      【讨论】:

        猜你喜欢
        • 2011-04-01
        • 1970-01-01
        • 2019-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-08
        • 1970-01-01
        • 2015-02-14
        相关资源
        最近更新 更多