2017-04-11 1 views
1

Je voudrais obtenir ce qui suit pour exécuterElixir, l'argument du déballage de la liste ou tuple

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 

Eh bien, le code ci-dessus est cassé, mais je pense que montre ce que je voudrais réaliser, je suis heureux Elixir newbie (apparemment :)) J'espère que ça peut être résolu avec de la magie d'élixir. Modifier: déplacé dans les travaux en fonction du commentaire.

Répondre

6

Ce que vous voudrez peut-être jeter un oeil est Kernel.apply/3.

Ce modèle est connu sous le nom MFA: Module, Function, Arguments. Cela nécessite que vos fonctions soient définies dans certains modules.

S'il vous plaît envisager de suivre par exemple:

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 

Alors:

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

je soupçonne que votre exemple réel implique une liste beaucoup plus longue de args, mais comment obtenir votre exemple pour travailler.

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

Vous avez raison avec votre hypothèse. J'ai une longue liste avec différentes fonctions qui prennent potentiellement différentes quantités d'arguments. Et c'est là que votre solution ne convient pas. Merci quand même! – user2679998