2009-10-08 6 views
5

Tôi muốn thực hiện một lựa chọn nhận nơi cần phải khớp một thuộc tính bản ghi, nhưng bất kỳ cú pháp nào tôi thử, tôi nhận được thông báo "mẫu bất hợp pháp".Erlang: Có cách nào để mẫu khớp với bản ghi trong điều khoản nhận không?

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

Điều này là không thể?

+2

Đây là một mô hình bất hợp pháp vì nó theo nghĩa đen có nghĩa là: ràng buộc yếu tố này của kỷ lục với giá trị nhận được nhận được. Chưa kể rằng truy cập phần tử bản ghi về cơ bản là một cuộc gọi hàm, mà không thể xuất hiện ở phía bên trái của một ràng buộc. – Zed

Trả lời

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

Chỉ cần một sự thay thế trong đó sử dụng mô hình kết hợp:

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

Đây là những gì tôi đã thực sự tìm kiếm. –

+0

Đó là một chút bối rối, mặc dù. Tham chiếu trong đường vòng lặp có vẻ như nó đang bị ràng buộc với State # s.reference, nhưng nó nằm trên rhs. –

+1

Đó là vì đó là một loại khác nhau của dấu bằng :) Đây là "cú pháp cú pháp" cho các bản ghi, nhưng dấu bằng của bạn là toán tử ràng buộc của Erlang. – Zed