Elixir,从列表或元组中解压缩参数

时间:2017-04-11 09:31:40

标签: arguments parameter-passing elixir metaprogramming

我想让以下内容运行

def myfunction(a, b) do
    IO.puts "Success"
end

def runstuff do
    jobs = {&myfunction/2, [1, 3]}
    {to_run, args} = jobs
    to_run.(args) # broken code
end

嗯,上面的代码已被破解,但我认为显示了我想要实现的目标,我很高兴Elixir新手(显然:) :)我希望它可以用一些灵药宏魔法来解决。 编辑:根据评论移动工作。

2 个答案:

答案 0 :(得分:7)

您可能需要查看的内容是Kernel.apply/3

这种模式称为MFAModuleFunctionArguments。这需要在某个模块中定义您的函数。

请考虑以下示例:

defmodule Fun do
  def myfunction(a, b) do
    IO.puts "Success, a: #{a}, b: #{b}"
  end

  def runstuff do
    jobs = {Fun, :myfunction, [1, 3]}
    {m, f, a} = jobs
    apply(m, f, a)
  end
end

Fun.runstuff

所以:

▶ elixir fun.exs
Success, a: 1, b: 3

答案 1 :(得分:0)

我怀疑你的真实例子涉及更长的args列表,但这是让你的例子工作的方法。

def myfunction(a, b) do
    IO.puts "Success"
end

def runstuff do
    jobs = {&myfunction/2, [1, 3]}
    {to_run, [a, b]} = jobs
    to_run.(a,b) # unbroken code
end