0

请帮助我在 Erlang 上正确编写函数。函数应该从队列中删除包(成功发送)。我认为应该是这样,但它不起作用。Erlang 说:第 3 行的非法模式 :(

delete_pkts(AcksList, State) ->
  NewSendingList = lists:filter(fun(X) ->
    lists:any(fun(E) -> case E of X#internal_packet.message_number -> false; _ -> true end end, AcksList)
  end, State#state.pkt_send),
  State#state{ pkt_send = NewSendingList }.
4

1 回答 1

1

我一直不明白为什么,但是您不能在 case 子句中放置记录字段引用。您可以在函数头中匹配您感兴趣的字段:

delete_pkts(AcksList, State) ->
  NewSendingList = lists:filter(fun(#internal_packet{message_number = MsgNo}) ->
    lists:any(fun(E) -> case E of MsgNo -> false; _ -> true end end, AcksList)
  end, State#state.pkt_send),
  State#state{ pkt_send = NewSendingList }.

或者,由于case表达式仅在匹配时返回falseE否则true,您可以使用=/=运算符:

delete_pkts(AcksList, State) ->
  NewSendingList = lists:filter(fun(X) ->
    lists:any(fun(E) -> E =/= X#internal_packet.message_number end, AcksList)
  end, State#state.pkt_send),
  State#state{ pkt_send = NewSendingList }.
于 2014-09-26T10:53:33.680 回答