You can use apply/3
which is just a wrapper around :erlang.apply/3
. It simply invokes the given function
from the module
with an array of arguments
. Since you are passing arguments as the module and function names you can use variables.
apply(:lists, :nth, [1, [1,2,3]])
apply(module_name, method_name, [1, array])
If you want to understand more about how elixir handles function calls (and everything else) you should take a look at quote
and unquote
.
contents = quote do: unquote(module_name).unquote(method_name)(1, unquote(array))
which returns the homoiconic representation of the function call.
{{:.,0,[:lists,:nth]},0,[1,[1,2,3]]}
You can unquote
the quoted function call with Code.eval_quoted/3
{value, binding} = Code.eval_quoted(contents)
Edit: here is an example using Enum.fetch along with a var.
quoted_fetch = quote do: Enum.fetch([1,2,3], var!(item));
{value, binding} = Code.eval_quoted(quoted_fetch, [item: 2])
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…