【问题标题】:Call a function by its name and arity按名称和数量调用函数
【发布时间】:2017-02-16 17:40:53
【问题描述】:

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

my_fun(FunctionName, Arity) ->
    %Call FunctionName/Arity 
.

所以这样称呼它:

my_fun(foo, 3)

应该会调用函数foo/3

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

是否可以在 Erlang 中实现,如何实现?

【问题讨论】:

  • 在这种情况下,您想向foo 发送什么参数?
  • 类似 foo(1,2,3) 的东西会做,在这个例子中并不重要。在实际程序中,我计划有一个 case 语句,并根据 Arity 使用不同的参数调用它。
  • erlang:apply(FunctionName, lists:seq(1, Arity)) ?
  • 我最终使用了 apply(?MODULE, FunctionName, [some, args, here])。它的工作方式正是我需要的。

标签: function erlang arity


【解决方案1】:

您可以使用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

【讨论】:

  • 感谢您的帮助,Dogbert。我只是不知道 apply 函数,所以我尝试了一些奇怪的事情
【解决方案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),我没有看到不直接使用它的好处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 2019-07-30
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 2016-04-27
    相关资源
    最近更新 更多