3

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

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} 但这很难用。

我可以返回一个以列表作为参数的 fun,但是对于像 F([X]) 或 F([X, Y]) 这样的调用,这也很丑陋。

4

1 回答 1

3

在这里,您有 2 个具有相同名称的不同功能:

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

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

如果你把它们中的任何一个放在一个变量中,比如说……F1 = fun name/1或者F2 = fun name/2,你以后将不能互换使用这些变量,因为它们F1(1)会起作用,但F1(1,2)会失败(反之亦然F2)。

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

应用/2:

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.

使用应用/3:

use_name(Args) ->
  erlang:apply(?MODULE, name, Args).

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

希望这可以帮助。

于 2019-09-20T13:15:22.437 回答