2012-11-05 5 views
27

Ich würde gerne wissen, was genau ein Methodenname in Elixier ist:Wie kann eine Methode in Elixir dynamisch aufgerufen werden, indem sowohl der Name des Moduls als auch der Methode angegeben wird?

array = [1,2,3] 
module_name = :lists 
method_name = :nth     # this not working 
module_name.method_name(1, array) # error, undef function lists.method_name/2 
module_name.nth(1, array)   # returns 1, module_name is OK. It's an atom 

Aber ich kann fast die gleiche Sache in erlang tun:

A = [1,2,3]. 
X = lists. 
Y = nth. 
X:Y(1,A). # returns 1 

Wie kann ich dies tun in Elixier?

Antwort

39

Sie können apply/3 verwenden, das ist nur ein Wrapper um :erlang.apply/3. Es einfach invokes the given function from the module with an array of arguments. Da übergeben Sie Argumente als Modul und Funktionsnamen können Sie Variablen verwenden.

apply(:lists, :nth, [1, [1,2,3]]) 
apply(module_name, method_name, [1, array]) 

Wenn Sie mehr darüber wissen, wie Elixier Griffe Funktionsaufrufe (und alles andere) Sie einen Blick auf quote und unquote nehmen sollte.

contents = quote do: unquote(module_name).unquote(method_name)(1, unquote(array)) 

, die die homoiconic Darstellung des Funktionsaufrufs zurückgibt.

{{:.,0,[:lists,:nth]},0,[1,[1,2,3]]} 

können Sie unquote den Funktionsaufruf zitiert mit Code.eval_quoted/3

{value, binding} = Code.eval_quoted(contents) 

Edit: Hier ist ein Beispiel Enum.fetch zusammen mit einem var.

quoted_fetch = quote do: Enum.fetch([1,2,3], var!(item));    
{value, binding} = Code.eval_quoted(quoted_fetch, [item: 2]) 
+0

Gut. Der Methodenname ist also ein Atom. Jetzt denke ich, dass es nur die Syntax ist, die es uns nicht erlaubt, 'module.method' in elixir zu schreiben, oder? – halfelf

+1

Ich glaube, Sie haben Recht. Ich denke, der einzige Weg, dies zum Laufen zu bringen, wäre, die Syntax so zu ändern, dass Atome beim Aufruf von Modulfunktionen verwendet werden (d. H. ': Lists.: Nth'). Ich würde lieber nur in solchen Fällen anwenden. – lastcanal

+0

Danke. Diese Antwort ist sehr hilfreich. – halfelf

Verwandte Themen