2009-10-08 7 views
5

Chcę zrobić selektywny odbiór, w którym właściwość rekordowa musi być dopasowana, ale niezależnie od składni, którą próbuję, otrzymuję komunikat "nielegalny wzorzec".Erlang: Czy jest jakiś sposób na dopasowanie rekordu do klauzuli receive?

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

Czy to nie jest możliwe?

+2

To jest nielegalne, ponieważ wzór dosłownie znaczy: wiązać ten element rekordu do wartości otrzymanej przez otrzymać. Nie wspominając już o tym, że dostęp do elementu rekordu jest po prostu wywołaniem funkcji, które nie może pojawić się po lewej stronie wiązania. – Zed

Odpowiedz

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

tylko alternatywą, która wykorzystuje dopasowanie wzoru:

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

Tego właśnie szukałem. –

+0

To trochę kłopotliwe. Odniesienie w pętli wygląda tak, jakby wiązało się z State # s.reference, ale jest na rhs. –

+1

To dlatego, że jest to inny rodzaj znaku równości :) To jest "cukier syntaktyczny" dla rekordów, ale twoim znakiem równości jest operator wiążący Erlanga. – Zed

Powiązane problemy