2009-10-08 5 views
5

Ich möchte einen selektiven Empfang, wo eine Datensatzeigenschaft abgeglichen werden muss, tun, aber welche Syntax ich auch versuche, bekomme ich eine "illegale Muster" Nachricht.Erlang: Gibt es eine Möglichkeit, einen Datensatz in einer receive-Klausel mit einem Muster abzugleichen?

loop(State) -> 
    receive 
    {response, State#s.reference} -> do_something() 
    end. 

Ist das nicht möglich?

+2

Dies ist ein illegales Muster, weil es bedeutet wörtlich: binden, dieses Element des Datensatz auf den Wert erhalten, indem erhalten. Ganz zu schweigen davon, dass der Zugriff auf Datensatzelemente grundsätzlich ein Funktionsaufruf ist, der nicht auf der linken Seite einer Bindung erscheinen kann. – Zed

Antwort

8
loop(State) -> 
    receive 
     {response, R} when R =:= State#s.reference -> 
      do_something() 
    end. 
20

nur eine Alternative, die Musteranpassung verwendet:

loop(#s{reference = Reference} = State) -> 
    receive 
    {response, Reference} -> 
     do_something() 
    end. 
+1

Das ist, was ich wirklich gesucht habe. –

+0

Es ist allerdings ein wenig verwirrend. Die Referenz in der Loop-Zeile sieht so aus, als wäre sie an State # s.reference gebunden, aber auf der rechten Seite. –

+1

Das ist, weil das eine andere Art von Gleichheitszeichen ist :) Dies ist "syntaktischer Zucker" für Datensätze, aber Ihr Gleichheitszeichen ist Erlangs Bindeoperator. – Zed

Verwandte Themen