有没有办法遍历传递给 Elixir 中函数的所有参数?
Is there a way to iterate over all arguments passed to a function in Elixir?
我知道可以将单个 list
传递给一个函数,然后对其进行迭代。但是,我更喜欢具有更明确签名的函数。所以我真正想知道的是 Elixir 是否有任何东西等同于 Javascript 中的 arguments
对象。
据我所知,答案是否定的。我所看到的最接近这个主题的讨论是在对 this question.
的回答中
我寻找此功能的原因是,我曾多次发现自己对多个参数应用相同的转换,这有点乏味。这可以通过宏实现吗?
这是可能的,但我很少使用它:
在函数顶部调用 binding()
将为您提供范围内绑定的关键字列表及其值,如果您将其作为函数的第一行调用,则这些值将是参数,即:
iex(6)> defmodule Mod do
...(6)> def args(a, b, c) do
...(6)> for {arg, val} <- binding() do
...(6)> IO.puts "#{arg} = #{inspect val}"
...(6)> end
...(6)> end
...(6)> end
iex(7)> Mod.args(1,2,3)
a = 1
b = 2
c = 3
[:ok, :ok, :ok]
我知道可以将单个 list
传递给一个函数,然后对其进行迭代。但是,我更喜欢具有更明确签名的函数。所以我真正想知道的是 Elixir 是否有任何东西等同于 Javascript 中的 arguments
对象。
据我所知,答案是否定的。我所看到的最接近这个主题的讨论是在对 this question.
的回答中我寻找此功能的原因是,我曾多次发现自己对多个参数应用相同的转换,这有点乏味。这可以通过宏实现吗?
这是可能的,但我很少使用它:
在函数顶部调用 binding()
将为您提供范围内绑定的关键字列表及其值,如果您将其作为函数的第一行调用,则这些值将是参数,即:
iex(6)> defmodule Mod do
...(6)> def args(a, b, c) do
...(6)> for {arg, val} <- binding() do
...(6)> IO.puts "#{arg} = #{inspect val}"
...(6)> end
...(6)> end
...(6)> end
iex(7)> Mod.args(1,2,3)
a = 1
b = 2
c = 3
[:ok, :ok, :ok]