已经用保护子句定义的 Erlang 函数



编写递归函数,我想要一个在列表有元素时执行的fn,而在列表为空时执行另一个fn:

 transfer(Master, [H|Tail]) ->
  Master ! {transfer, H},
  transfer(Master, Tail).
transfer(_Master, []) ->
  nil.

我遇到的问题是src/redis/redis_worker.erl:13: function transfer/2 already defined.我知道它对具有相同名称和 arity 的两个函数感到不安,但这两个应该不同。

问题是函数的子句需要用分号而不是句点分隔。

transfer(Master, [H|Tail]) ->
    Master ! {transfer, H},
    transfer(Master, Tail); % use semicolon here, not period
transfer(_Master, []) ->
    nil.

当您使用句点终止子句时,编译器会认为该函数的定义是完整的,因此它会将您的代码视为两个单独的函数,而不是同一函数的不同子句。

有关更多详细信息,请参阅函数声明语法的 Erlang 参考。

您需要使用分号而不是冒号来分隔两个函数子句。

最新更新