通过名称和参数调用函数
Call a function by its name and arity
我正在尝试编写一个调用具有指定名称和参数的函数的函数:
my_fun(FunctionName, Arity) ->
%Call FunctionName/Arity
.
所以这样称呼它:
my_fun(foo, 3)
应该调用函数 foo/3
。
问题是,如果只指定了名称和元数,我不知道如何调用函数。我尝试调用的函数保证存在于我尝试调用它的同一模块中。
是否可以在 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)
,我看不出不直接使用它有什么好处。
我正在尝试编写一个调用具有指定名称和参数的函数的函数:
my_fun(FunctionName, Arity) ->
%Call FunctionName/Arity
.
所以这样称呼它:
my_fun(foo, 3)
应该调用函数 foo/3
。
问题是,如果只指定了名称和元数,我不知道如何调用函数。我尝试调用的函数保证存在于我尝试调用它的同一模块中。
是否可以在 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)
,我看不出不直接使用它有什么好处。