2010-03-23 2 views
3

여기 [1]에서 설명한대로 가드에서 레코드를 사용하려고합니다. 내가 거기에 설명 된 약식 사용하는 경우 :가드에있는 레코드

handle(Msg, State) when Msg#msg.to==void, Msg#msg.no==3 -> 

모두가 잘 ... :

handle(Msg, State) when Msg==#msg{to=void, no=3} -> 

을 내가 완전히로 확장하면 ... 나는, 그러나 ... 일치를 얻을 수 없다. 대부분의 erlang 문서와 관련이있는 것으로 보입니다. 잘못 읽었습니까?

덕분에, --tim

[1] - http://www1.erlang.org/doc/reference_manual/records.html#id2278275

+3

단지 추측하지만 첫 번째 : 나는 그것을 다루는 방법은 레코드 이름이어야합니다 레코드의 첫 번째 요소를 테스트하는 것입니다 match는 레코드에 다른 필드가 없거나 다른 모든 필드가 undefined로 설정되어 있다고 가정합니다. msg 레코드에 실패하게하는 다른 필드가있는 경우. –

+0

감사합니다. Jeremy, 그게 다른 가치있는 필드가 있어야합니다, 나는 그들이 의미 상 동일하다고 생각했습니다. 다시 한 번 감사드립니다 ... – Tim

+0

함수 노트에서 패턴 매칭을 사용하여이 작업을 수행 할 수 있습니다. 평등 테스트를했기 때문에 경기가 실패했습니다. 패턴 일치에서 바인딩에 대해 같음 = 및 패턴 =에 대한 시각적 유사성에 의해 트립되었을 수 있습니다. –

답변

11

가드에서 #msg{to=void, no=3}을 말하면 언급하지 않은 모든 필드는 기본값 (보통 undefined)으로 설정됩니다. 따라서 목록에없는 필드 중 일부가 일치하지 않아 경비가 일치하지 않습니다. 이 패턴은 MSG 레코드 (튜플에 MSG 레코드의 크기를 메시지가 필요

handle(Msg = #msg{to=void, no=3}, State) -> 
    ... 

:로

나는 가능하면 항상 가드가 아닌 패턴을 사용하는 경향이

, 그래서 절을 작성합니다 첫 번째 요소는 msg), to 요소는 void이어야하며 no 요소는 3이어야합니다. msg 레코드의 다른 요소는 무엇이든 될 수 있습니다.

+0

모두가 추측했듯이, 나는 대신 패턴을 사용해야합니다 ...이 학습 곡선은 가파르지만 즐겁습니다 ... 다시 감사드립니다 ... – Tim

4

난 당신이 이미 문제를 해결을 참조하십시오. 그냥 참고 : 일반적으로이 같은 경기를 써서 관용적 얼랑에 : 물론

handle(Msg = #msg{to = void, no = 3}, State) -> 

, 그것은 취향에 내려오고, 시간에 좀 더 만족스러운 라인 정렬을 얻을 대신 가드를 사용하는 것이 좋습니다 .

4

당신은 당신이 그것을 내 전체 MSG 기록 값 있지만, 일부 필드가 필요하지 않은 경우

handle(#msg{to=void, no=3}=Msg, State) -> 
    do_stuff(Msg). 

다음과 일치하는이

처럼 파괴 할 수있는 대신, 그 간결 다음과 같은 패턴을 사용 할 수 있습니다
handle(#msg{to=void, no=3, data=Data}, State) -> 
    do_stuff(Data). 
0

큰 레코드 일 경우 일치하는 레코드가 번거롭 수 있습니다.

핸들 (무엇이든) 요소 (1, 메시지) == MSG

관련 문제