2009-10-08 3 views
5

Je veux faire une réception sélective où une propriété d'enregistrement doit être mise en correspondance, mais quelle que soit la syntaxe que j'essaie, j'obtiens un message "motif illégal".Erlang: Existe-t-il un moyen de modéliser un enregistrement dans une clause receive?

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

N'est-ce pas possible?

+2

Ceci est un motif illégal, car cela signifie littéralement: lier cet élément de l'enregistrement à la valeur reçue par recevoir. Sans oublier que l'accès à l'élément d'enregistrement est fondamentalement un appel de fonction, qui ne peut pas apparaître sur le côté gauche d'une liaison. – Zed

Répondre

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

seulement une alternative qui utilise la correspondance de motif:

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

C'est ce que je cherchais vraiment. –

+0

C'est un peu déroutant, cependant. La référence dans la ligne de boucle semble être liée à la référence d'état, mais c'est sur la rhs. –

+1

C'est parce que c'est un genre différent de signe égal :) Ceci est "sucre syntaxique" pour les enregistrements, mais votre signe égal est l'opérateur de liaison d'Erlang. – Zed

Questions connexes