2014-09-26 23 views
0

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

라인에 불법 패턴 당신은 당신이 관심있는 분야를 일치 수 대신 기능 헤드 :

case 표현은 단지 false E 경우 일치를 반환으로 또는
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 }. 

, 그렇지 않으면 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)와 동의어이며 이는 절에서 허용되지 않는 함수 호출입니다 –