通过名称和arity调用函数

Ser*_*nik 1 erlang function arity

我正在尝试编写一个函数来调用具有指定名称和arity的函数:

my_fun(FunctionName, Arity) ->
    %Call FunctionName/Arity 
.
Run Code Online (Sandbox Code Playgroud)

所以这样调用它:

my_fun(foo, 3)
Run Code Online (Sandbox Code Playgroud)

应该导致调用函数foo/3.

问题是,如果只指定了其名称和arity,我不知道如何调用函数.我试图调用的函数保证存在于我试图调用它的同一模块中.

是否可以在Erlang中实现这一点,以及如何实现?

Dog*_*ert 5

您可以使用erlang:apply/3第一个参数?MODULE来引用同一个模块,第二个参数是函数的名称作为原子,第三个是包含Arity元素的列表:

-module(a).
-compile(export_all).

my_fun(FunctionName, Arity) ->
  apply(?MODULE, FunctionName, lists:seq(1, Arity)).

foo(A, B, C) ->
  io:format("~p ~p ~p~n", [A, B, C]).

bar(A, B) ->
  io:format("~p ~p~n", [A, B]).

main() ->
  my_fun(foo, 3),
  my_fun(bar, 2).
Run Code Online (Sandbox Code Playgroud)

输出:

1> c(a), a:main().
1 2 3
1 2
Run Code Online (Sandbox Code Playgroud)