... [Msg | important()]
が初めて返される
は、最終戻り値の形式が決定されます。唯一の心配は、最終的な戻り値の詳細がまだすべてわからないということです。 [Msg | important()]
のimportant()
は引き続き評価されます。以下は、最終戻り値[high,high,low,low]
がどのように構築されているかを示したものです。機能important/0
でコードがどのように動作する
[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
...
は、after 0
は単に「メッセージが来るのを私は待っていない」という意味 - 私のメールボックスのいずれかのメッセージがある場合には、Iそれを見るでしょう。もし存在しなければ、そこを待つのではなく、私は(normal()
を実行して)続けるだろう。メールボックスには、すでに{15、高}、{7、低}、{1、低}、{17、高}があります。 Erlangでは、メールボックスのメッセージはではなく、は先着順にキューに入れられています。 receive
節は厄介なことがあります。メールボックス内のすべてのメッセージをスキャンし、必要なものを「選択」します。私たちの場合、{Priority, Msg} when Priority > 10
に従って、{15、高}と{17、高}が最初に選ばれます。 その後、関数normal/0
が引き継ぎます。そして{7、低い}、{1、低い}は順番に処理されます(consed)。最後に、[high,high,low,low]
を取得しました。
処理順序を明らかに変更されたバージョン...
我々は処理(コンス)順番がより明確にするために、コードを少し変更することができ
:
-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.
ファイル名を指定して実行それはシェル内にあります:
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}]
連結されていません。連結は、あなたが 'L1'と' L2'の2つのリストを持ち、それらを連結するときです: 'L1 ++ L2'。 consiningは要素 'E'とリスト' L'を持ち、拡張リスト '[E | L] 'となる。 –