Function 通过函数名和算术调用函数

Function 通过函数名和算术调用函数,function,erlang,arity,Function,Erlang,Arity,我正在尝试编写一个函数,该函数调用具有指定名称和arity的函数: my_fun(FunctionName, Arity) -> %Call FunctionName/Arity . 所以这样称呼它: my_fun(foo, 3) 应导致调用函数foo/3 问题是,如果只指定了函数名和arity,我不知道如何调用函数。我试图调用的函数保证存在于我试图调用它的同一个模块中 是否可以在Erlang中实现这一点,以及如何实现?您可以使用Erlang:apply/3,第一个参数是?M

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

my_fun(FunctionName, Arity) ->
    %Call FunctionName/Arity 
.
所以这样称呼它:

my_fun(foo, 3)
应导致调用函数
foo/3

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


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

您可以使用
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).
输出:

1> c(a), a:main().
1 2 3
1 2

不太清楚你想做什么

这对你有帮助吗

-module (cf).

-export ([cf/2,test/0,f/1,f/2,f/3]).

cf(F,1) ->
    fun(P1) -> apply(cf,F,[P1]) end;
cf(F,2) ->
    fun(P1,P2) -> apply(cf,F,[P1,P2]) end;
cf(F,3) ->
    fun(P1,P2,P3) -> apply(cf,F,[P1,P2,P3]) end.

f(X) -> lists:seq(1,X).
f(X,Y) -> X+Y.
f(X,Y,Z) -> {X,Y,Z}.

test() ->
    A = cf(f,1),
    B = cf(f,2),
    C = cf(f,3),
    {A(3),B(5,6),C(a,12,"hello")}.

1> c(cf).    
{ok,cf}
2> cf:test().
{[1,2,3],11,{a,12,"hello"}}

但是这只是隐藏了函数:
apply(Module,function,Args)
,我不认为不直接使用它有什么好处。

在这种情况下,您希望发送什么参数到
foo
?类似foo(1,2,3)的东西就可以了,在示例中并不重要。在实际的程序中,我计划使用一个case语句,并根据Arity使用不同的参数调用它。
erlang:apply(FunctionName,list:seq(1,Arity))
?我最终使用了apply(?MODULE,FunctionName,[some,args,here])。这正是我需要的。谢谢你的帮助,狗伯特。我只是不知道apply函数,所以我尝试了一些奇怪的事情