2014-09-26 2 views
0

Пожалуйста, помогите мне правильно написать функцию на Erlang. Функция должна удалять пакеты (которые успешно отправлены) из очереди. Я думаю, это должно быть так, но это не сработает. Erlang говорит:. Нелегальный рисунок на линии 3 :(Erlang: функция с переменной из другой области

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 }. 

ответ

1

Я никогда не понимал, почему, но вы не можете поставить ссылку на запись поля в пункте случае Вы могли бы соответствовать вне поля вы заинтересованы в в функции вместо головы:

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 просто возвращает false если таковые E матчи, и 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 }. 
+1

Предполагая, например, что message_number является вторым полем во внутреннем пакете записи X # internal_packet.message_number является синонимом элемента (3, X), и это вызов функции, который не разрешен ни в предложении –