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])之类的调用,这也很难看。
答案 0 :(得分:3)
这里有两个具有相同名称的不同功能:
name(X) -> X.
name(X,Y) -> X * Y.
这两个函数作为匿名函数分别是:fun name/1
和fun name/2
。
如果将它们中的任何一个放入变量中,例如…F1 = fun name/1
或F2 = 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.
希望这会有所帮助。