【问题标题】:Elixir, unpacking argument from list or tupleElixir,从列表或元组中解包参数
【发布时间】:2017-09-06 14:38:04
【问题描述】:

我想运行以下命令

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 新手(显然 :))我希望它可以通过一些 elixir 宏魔法来解决。 编辑:根据评论调入工作岗位。

【问题讨论】:

    标签: arguments parameter-passing elixir metaprogramming


    【解决方案1】:

    你可能想看看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
    

    【讨论】:

      【解决方案2】:

      我怀疑您的真实示例涉及更长的参数列表,但这是使您的示例起作用的方法。

      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
      

      【讨论】:

      • 你的假设是对的。我确实有很长的列表,其中包含不同的函数,所有这些函数都可能采用不同数量的参数。这就是您的解决方案不适合的地方。还是谢谢!
      猜你喜欢
      • 2013-09-30
      • 2012-04-16
      • 1970-01-01
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 2014-08-03
      • 1970-01-01
      相关资源
      最近更新 更多