Erlang接收循环-变量未绑定问题

Erlang接收循环-变量未绑定问题,erlang,variable-assignment,Erlang,Variable Assignment,所以我需要编写这个函数,它从三个不同的进程接收一个数字并保存它们。我不能让它工作,我得到了“变量未绑定”错误 由于代码有三条路径,并且在每个路径中,您将只绑定变量TimeClient1、TimeClient2和TimeClient3中的一个,因此始终有两个未绑定。更糟糕的是,你的代码从未停止过。您将收到消息,然后计算if语句,然后递归调用serverB2code一次又一次。接收后,您的语句没有任何代码路径 我会这样写 serverB2(Time, Client1, Client2, Client

所以我需要编写这个函数,它从三个不同的进程接收一个数字并保存它们。我不能让它工作,我得到了“变量未绑定”错误


由于代码有三条路径,并且在每个路径中,您将只绑定变量
TimeClient1
TimeClient2
TimeClient3
中的一个,因此始终有两个未绑定。更糟糕的是,你的代码从未停止过。您将收到消息,然后计算if语句,然后递归调用
serverB2
code一次又一次。接收后,您的语句没有任何代码路径

我会这样写

serverB2(Time, Client1, Client2, Client3) ->
  List = [ Time
      | [ receive {Client, TimeClient} -> TimeClient end
        || Client <- [Client1, Client2, Client3]]],
  io:format("~w~n", [List]).
这就是编译器如何翻译上面的列表理解


我在这里使用的技巧是,我接收消息的顺序是我想要的,而不是它们到达邮箱的顺序。我在这里使用选择性接收,因为在上面两个示例中,变量
Client
都绑定在接收模式中。还有一种更为复杂的方式,即如何按消息到达的顺序接收消息,您应该在有充分理由(例如性能)的情况下使用这种方式。

您会收到变量未绑定错误,因为您的代码有三条路径,并且在每条路径中,您只会绑定一个变量
TimeClient1
TimeClient2
TimeClient3
因此您总是将其中两个解除绑定。更糟糕的是,你的代码从未停止过。您将收到消息,然后计算if语句,然后递归调用
serverB2
code一次又一次。接收后,您的语句没有任何代码路径

我会这样写

serverB2(Time, Client1, Client2, Client3) ->
  List = [ Time
      | [ receive {Client, TimeClient} -> TimeClient end
        || Client <- [Client1, Client2, Client3]]],
  io:format("~w~n", [List]).
这就是编译器如何翻译上面的列表理解

我在这里使用的技巧是,我接收消息的顺序是我想要的,而不是它们到达邮箱的顺序。我在这里使用选择性接收,因为在上面两个示例中,变量
Client
都绑定在接收模式中。还有一种更为复杂的方式,即如何按消息到达的顺序接收消息,您应该在有充分理由(例如性能)的情况下使用这种方式

serverB2(Time, Client1, Client2, Client3) ->
  List = [ Time | collect_times([Client1, Client2, Client3])],
  io:format("~w~n", [List]).

collect_times([]) -> [];
collect_times([Client|Tail]) ->
  TimeClient = receive {Client, Time} -> Time end,
  [ TimeClient | collect_times(Tail) ].