编写一个递归函数,我想要一个 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
.我知道它对具有相同名称和数量的两个函数感到不安,但这两个应该不同。
最佳答案
问题是函数的子句需要用分号而不是句点分隔。
transfer(Master, [H|Tail]) ->
Master ! {transfer, H},
transfer(Master, Tail); % use semicolon here, not period
transfer(_Master, []) ->
nil.
当您使用句点终止子句时,编译器认为该函数的定义是完整的,因此它将您的代码视为两个单独的函数,而不是同一函数的不同子句。
请参阅 Function Declaration Syntax 的 Erlang 引用更多细节。
关于Erlang 函数已经用保护子句定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12824959/