Làm thế nào giá trị trả về thức được xây dựng ...
Khi [Msg | important()]
đang được trả lại cho lần đầu tiên, hình thức giá trị trả về thức được xác định. Mối quan tâm duy nhất là, chúng tôi không biết tất cả các chi tiết của giá trị trả lại cuối cùng. Vì vậy, important()
trong [Msg | important()]
sẽ tiếp tục được đánh giá. Sau đây là minh họa về cách thức giá trị trả lại cuối cùng [high,high,low,low]
được xây dựng.
[high | important( )] <---- Defines the final form
---------------------------------
[high | important( )] <---- Adds more details
------------------------
normal( ) <---- Adds more details
------------------------
[low | normal( )] <---- Adds more details
----------------
[low | normal()] <---- Adds more details
--------
[ ] <---- Adds more details
------------------------------------------
[high | [high | [low | [low | []]]]]
[high,high,low,low] <---- The final return value
Làm thế nào mã hoạt động ...
Trong chức năng important/0
, after 0
chỉ có nghĩa là "Tôi không đợi đến khi thư đến" - nếu có bất kỳ tin nhắn trong hộp thư của tôi, tôi sẽ nhìn vào nó; nếu không có, tôi sẽ tiếp tục (thực hiện normal()
) thay vì đợi ở đó.Trong hộp thư, có {15, cao}, {7, thấp}, {1, thấp}, {17, cao} đang ngồi ở đó. Trong Erlang, các thư trong hộp thư là Không phải được xếp hàng đợi theo thứ tự đến trước được phục vụ trước. Mệnh đề receive
có thể là cầu kỳ. Nó quét qua tất cả các tin nhắn trong hộp thư và "chọn" những thông điệp mong muốn. Trong trường hợp của chúng tôi, {15, high} và {17, high} được chọn trước theo số {Priority, Msg} when Priority > 10
. Sau đó, chức năng normal/0
sẽ kết thúc. Và {7, low}, {1, low} được xử lý (được chấp nhận) theo thứ tự. Cuối cùng, chúng tôi đã nhận được [high,high,low,low]
.
Một phiên bản sửa đổi đó cho thấy trình tự chế biến ...
Chúng ta có thể thay đổi mã một chút để làm cho quá trình xử lý (consing) Để rõ ràng hơn:
-module(prior).
-compile(export_all).
important() ->
receive
{Priority, Msg} when Priority > 10 ->
[{Priority, Msg} | important()] % <---- Edited
after 0 ->
normal()
end.
normal() ->
receive
{Priority, Msg} -> % <---- Edited
[{Priority, Msg} | normal()] % <---- Edited
after 0 ->
[]
end.
Run trong vỏ:
4> c(prior).
{ok, prior}
5> self() ! {15, high}, self() ! {7, low}, self() ! {1, low}, self() ! {17, high}.
{17,high}
6> prior:important().
[{15,high},{17,high},{7,low},{1,low}]
Không được nối, được bảo vệ. nối là khi bạn có hai danh sách, 'L1' và' L2' và nối chúng: 'L1 ++ L2'. Consing là khi bạn có một phần tử 'E' và một danh sách' L' và sau đó tạo thành danh sách mở rộng '[E | L] '. –