有没有一种方法可以回报可以拥有多个爱慕的乐趣?

时间:2019-09-20 11:01:17

标签: function erlang arity

Erlang函数可以共享相同的名称,但具有不同的arity。例如:

name(X) -> X.
name(X,Y) -> X * Y.

我希望能够从行为相同的函数中返回乐趣。

在此示例中,我想要一种将fun / 1和fun / 2作为一次返回返回的方法,因此可以按照上述函数示例的任何一种方式来调用返回的fun。

function() ->
    fun(X) -> X end,
    fun(X,Y) -> X * Y end.

我可以返回一个元组{F1,F2},但是使用起来很丑。

我可以返回一个有趣的东西,它以列表作为参数,但是对于像F([X])或F([X,Y])之类的调用,这也很难看。

1 个答案:

答案 0 :(得分:3)

这里有两个具有相同名称的不同功能:

name(X) -> X.
name(X,Y) -> X * Y.

这两个函数作为匿名函数分别是:fun name/1fun name/2

如果将它们中的任何一个放入变量中,例如…F1 = fun name/1F2 = fun name/2,则以后{em>可互换地使用,因为{{1 }}将起作用,但是F1(1)将失败(反之亦然,F1(1,2))。

如果您不知道在运行时将收到的参数数量(假设您收到的是可变长度的参数列表),则需要使用erlang:apply/2 or erlang:apply/3动态评估函数。在这种情况下,我可以为您提供2种方法(取决于您喜欢的F2的版本):

使用apply / 2:

erlang:apply

有适用/ 3:

use_name(Args) ->
  Fun = function(length(Args)),
  erlang:apply(Fun, Args).

function(1) -> fun(X) -> X end;
function(2) -> fun(X, Y) -> X * Y end.

希望这会有所帮助。