2017-04-11 68 views
1

拆包的說法,我想獲得以下運行藥劑,從列表或元組

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 

好了,上面的代碼被打破,但我想說明我想達到什麼樣的,我是一個快樂藥劑新手(顯然:))我希望它可以用一些藥劑宏魔法解決。 編輯:根據評論轉入工作。

回答

6

你可能想要看看的是Kernel.apply/3

這種模式被稱爲MFAModule,Function, Arguments。這需要你的函數在某個模塊中定義。

請考慮下面的例子:

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 
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 
+0

你說得對。我確實有很多不同的函數,可能會有不同數量的參數。這就是你的解決方案不適合的地方。不管怎麼說,還是要謝謝你! – user2679998